diff options
| author | Misko Hevery | 2012-02-22 13:28:42 -0800 | 
|---|---|---|
| committer | Misko Hevery | 2012-02-22 13:28:42 -0800 | 
| commit | 80edcadb1dd418dcf5adf85704c6693940c8bb28 (patch) | |
| tree | 5741696b48468a3387b6763559bff6b2be0a150b | |
| parent | c27a56f4da9bf89e471ac6597c135e2f19814f17 (diff) | |
| download | angular.js-80edcadb1dd418dcf5adf85704c6693940c8bb28.tar.bz2 | |
feat($provide): added constant 
| -rw-r--r-- | src/Injector.js | 25 | ||||
| -rw-r--r-- | src/loader.js | 17 | ||||
| -rw-r--r-- | test/InjectorSpec.js | 23 | ||||
| -rw-r--r-- | test/loaderSpec.js | 2 | 
4 files changed, 63 insertions, 4 deletions
| diff --git a/src/Injector.js b/src/Injector.js index c24cbb51..c45e7dd0 100644 --- a/src/Injector.js +++ b/src/Injector.js @@ -246,14 +246,29 @@ function inferInjectionArgs(fn) {   * A short hand for configuring services if the `$get` method is a constant.   *   * @param {string} name The name of the instance. NOTE: the provider will be available under `name + 'Provide'` key. - * @param {function()} value The $getFn for the instance creation. Internally this is a short hand for - * `$provide.service(name, {$get:function(){ return value; }})`. + * @param {*} value The value.   * @returns {Object} registered provider instance   */  /**   * @ngdoc method + * @name angular.module.AUTO.$provide#constant + * @methodOf angular.module.AUTO.$provide + * @description + * + * A constant value, but unlike {@link angular.module.AUTO.$provide#value value} it can be injected + * into configuration function (other modules) and it is not interceptable by + * {@link angular.module.AUTO.$provide#decorator decorator}. + * + * @param {string} name The name of the constant. + * @param {*} value The constant value. + * @returns {Object} registered instance + */ + + +/** + * @ngdoc method   * @name angular.module.AUTO.$provide#decorator   * @methodOf angular.module.AUTO.$provide   * @description @@ -282,6 +297,7 @@ function createInjector(modulesToLoad) {              service: supportObject(service),              factory: supportObject(factory),              value: supportObject(value), +            constant: supportObject(constant),              decorator: decorator            }        }, @@ -328,6 +344,11 @@ function createInjector(modulesToLoad) {    function value(name, value) { return factory(name, valueFn(value)); } +  function constant(name, value) { +    providerCache[name] = value; +    instanceCache[name] = value; +  } +    function decorator(serviceName, decorFn) {      var origProvider = providerInjector.get(serviceName + providerSuffix),          orig$get = origProvider.$get; diff --git a/src/loader.js b/src/loader.js index d1753ac8..604beaef 100644 --- a/src/loader.js +++ b/src/loader.js @@ -142,6 +142,18 @@ function setupModuleLoader(window) {            /**             * @ngdoc method +           * @name angular.Module#constant +           * @methodOf angular.Module +           * @param {string} name constant name +           * @param {*} object Constant value. +           * @description +           * Because the constant are fixed, they get applied before other provide methods. +           * See {@link angular.module.AUTO.$provide#constant $provide.constant()}. +           */ +          constant: invokeLater('$provide', 'constant', 'unshift'), + +          /** +           * @ngdoc method             * @name angular.Module#filter             * @methodOf angular.Module             * @param {string} name filter name @@ -199,11 +211,12 @@ function setupModuleLoader(window) {          /**           * @param {string} provider           * @param {string} method +         * @param {String=} insertMethod           * @returns {angular.Module}           */ -        function invokeLater(provider, method) { +        function invokeLater(provider, method, insertMethod) {            return function() { -            invokeQueue.push([provider, method, arguments]); +            invokeQueue[insertMethod || 'push']([provider, method, arguments]);              return moduleInstance;            }          } diff --git a/test/InjectorSpec.js b/test/InjectorSpec.js index e0cabbac..2ea5b66d 100644 --- a/test/InjectorSpec.js +++ b/test/InjectorSpec.js @@ -260,6 +260,29 @@ describe('injector', function() {      });      describe('$provide', function() { +      describe('constant', function() { +        it('should create configuration injectable constants', function() { +          var log = []; +          createInjector([ +              function($provide){ +                $provide.constant('abc', 123); +                $provide.constant({a: 'A', b:'B'}); +                return function(a) { +                  log.push(a); +                } +              }, +              function(abc) { +                log.push(abc); +                return function(b) { +                  log.push(b); +                } +              } +          ]).get('abc'); +          expect(log).toEqual([123, 'A', 'B']); +        }); +      }); + +        describe('value', function() {          it('should configure $provide values', function() {            expect(createInjector([function($provide) { diff --git a/test/loaderSpec.js b/test/loaderSpec.js index f983c08b..5d234b6d 100644 --- a/test/loaderSpec.js +++ b/test/loaderSpec.js @@ -38,10 +38,12 @@ describe('module loader', function() {        filter('f', 'ff').        directive('d', 'dd').        config('init2'). +      constant('abc', 123).        run('runBlock')).toBe(myModule);      expect(myModule.requires).toEqual(['other']);      expect(myModule._invokeQueue).toEqual([ +      ['$provide', 'constant', ['abc', 123] ],        ['$injector', 'invoke', ['config'] ],        ['$provide', 'service', ['sk', 'sv'] ],        ['$provide', 'factory', ['fk', 'fv'] ], | 
