aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMisko Hevery2012-02-22 13:28:42 -0800
committerMisko Hevery2012-02-22 13:28:42 -0800
commit80edcadb1dd418dcf5adf85704c6693940c8bb28 (patch)
tree5741696b48468a3387b6763559bff6b2be0a150b
parentc27a56f4da9bf89e471ac6597c135e2f19814f17 (diff)
downloadangular.js-80edcadb1dd418dcf5adf85704c6693940c8bb28.tar.bz2
feat($provide): added constant
-rw-r--r--src/Injector.js25
-rw-r--r--src/loader.js17
-rw-r--r--test/InjectorSpec.js23
-rw-r--r--test/loaderSpec.js2
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'] ],