mirror of
https://github.com/zhigang1992/angular.js.git
synced 2026-01-13 08:59:54 +08:00
This change ensures that a module's config blocks are always invoked after all of its providers are
registered.
BREAKING CHANGE:
Previously, config blocks would be able to control behaviour of provider registration, due to being
invoked prior to provider registration. Now, provider registration always occurs prior to configuration
for a given module, and therefore config blocks are not able to have any control over a providers
registration.
Example:
Previously, the following:
angular.module('foo', [])
.provider('$rootProvider', function() {
this.$get = function() { ... }
})
.config(function($rootProvider) {
$rootProvider.dependentMode = "B";
})
.provider('$dependentProvider', function($rootProvider) {
if ($rootProvider.dependentMode === "A") {
this.$get = function() {
// Special mode!
}
} else {
this.$get = function() {
// something else
}
}
});
would have "worked", meaning behaviour of the config block between the registration of "$rootProvider"
and "$dependentProvider" would have actually accomplished something and changed the behaviour of the
app. This is no longer possible within a single module.
Fixes #7139
Closes #7147
88 lines
2.6 KiB
JavaScript
88 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
describe('module loader', function() {
|
|
var window;
|
|
|
|
beforeEach(function () {
|
|
window = {};
|
|
setupModuleLoader(window);
|
|
});
|
|
|
|
|
|
it('should set up namespace', function() {
|
|
expect(window.angular).toBeDefined();
|
|
expect(window.angular.module).toBeDefined();
|
|
});
|
|
|
|
|
|
it('should not override existing namespace', function() {
|
|
var angular = window.angular;
|
|
var module = angular.module;
|
|
|
|
setupModuleLoader(window);
|
|
expect(window.angular).toBe(angular);
|
|
expect(window.angular.module).toBe(module);
|
|
});
|
|
|
|
|
|
it('should record calls', function() {
|
|
var otherModule = window.angular.module('other', []);
|
|
otherModule.config('otherInit');
|
|
|
|
var myModule = window.angular.module('my', ['other'], 'config');
|
|
|
|
expect(myModule.
|
|
provider('sk', 'sv').
|
|
factory('fk', 'fv').
|
|
service('a', 'aa').
|
|
value('k', 'v').
|
|
filter('f', 'ff').
|
|
directive('d', 'dd').
|
|
controller('ctrl', 'ccc').
|
|
config('init2').
|
|
constant('abc', 123).
|
|
run('runBlock')).toBe(myModule);
|
|
|
|
expect(myModule.requires).toEqual(['other']);
|
|
expect(myModule._invokeQueue).toEqual([
|
|
['$provide', 'constant', ['abc', 123] ],
|
|
['$provide', 'provider', ['sk', 'sv'] ],
|
|
['$provide', 'factory', ['fk', 'fv'] ],
|
|
['$provide', 'service', ['a', 'aa'] ],
|
|
['$provide', 'value', ['k', 'v'] ],
|
|
['$filterProvider', 'register', ['f', 'ff'] ],
|
|
['$compileProvider', 'directive', ['d', 'dd'] ],
|
|
['$controllerProvider', 'register', ['ctrl', 'ccc']],
|
|
]);
|
|
expect(myModule._configBlocks).toEqual([
|
|
['$injector', 'invoke', ['config'] ],
|
|
['$injector', 'invoke', ['init2'] ]
|
|
]);
|
|
expect(myModule._runBlocks).toEqual(['runBlock']);
|
|
});
|
|
|
|
|
|
it('should allow module redefinition', function() {
|
|
expect(window.angular.module('a', [])).not.toBe(window.angular.module('a', []));
|
|
});
|
|
|
|
|
|
it('should complain of no module', function() {
|
|
expect(function() {
|
|
window.angular.module('dontExist');
|
|
}).toThrowMinErr("$injector", "nomod", "Module 'dontExist' is not available! You either misspelled the module name " +
|
|
"or forgot to load it. If registering a module ensure that you specify the dependencies as the second " +
|
|
"argument.");
|
|
});
|
|
|
|
it('should complain if a module is called "hasOwnProperty', function() {
|
|
expect(function() {
|
|
window.angular.module('hasOwnProperty', []);
|
|
}).toThrowMinErr('ng','badname', "hasOwnProperty is not a valid module name");
|
|
});
|
|
|
|
it('should expose `$$minErr` on the `angular` object', function() {
|
|
expect(window.angular.$$minErr).toEqual(jasmine.any(Function));
|
|
});
|
|
});
|