mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-31 21:40:27 +00:00
feat(module): add runtime block
This commit is contained in:
parent
16a40c626f
commit
5cdfe45aa3
5 changed files with 67 additions and 21 deletions
|
|
@ -272,7 +272,7 @@ function createInjector(modulesToLoad) {
|
|||
}));
|
||||
|
||||
|
||||
loadModules(modulesToLoad);
|
||||
forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });
|
||||
|
||||
return instanceInjector;
|
||||
|
||||
|
|
@ -318,15 +318,16 @@ function createInjector(modulesToLoad) {
|
|||
// Module Loading
|
||||
////////////////////////////////////
|
||||
function loadModules(modulesToLoad){
|
||||
var runBlocks = [];
|
||||
forEach(modulesToLoad, function(module) {
|
||||
if (loadedModules.get(module)) return;
|
||||
loadedModules.put(module, true);
|
||||
if (isString(module)) {
|
||||
var moduleFn = angularModule(module);
|
||||
loadModules(moduleFn.requires);
|
||||
runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);
|
||||
|
||||
try {
|
||||
for(var invokeQueue = moduleFn.invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++) {
|
||||
for(var invokeQueue = moduleFn._invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++) {
|
||||
var invokeArgs = invokeQueue[i],
|
||||
provider = invokeArgs[0] == '$injector'
|
||||
? providerInjector
|
||||
|
|
@ -340,14 +341,14 @@ function createInjector(modulesToLoad) {
|
|||
}
|
||||
} else if (isFunction(module)) {
|
||||
try {
|
||||
providerInjector.invoke(module);
|
||||
runBlocks.push(providerInjector.invoke(module));
|
||||
} catch (e) {
|
||||
if (e.message) e.message += ' from ' + module;
|
||||
throw e;
|
||||
}
|
||||
} else if (isArray(module)) {
|
||||
try {
|
||||
providerInjector.invoke(module);
|
||||
runBlocks.push(providerInjector.invoke(module));
|
||||
} catch (e) {
|
||||
if (e.message) e.message += ' from ' + String(module[module.length - 1]);
|
||||
throw e;
|
||||
|
|
@ -356,6 +357,7 @@ function createInjector(modulesToLoad) {
|
|||
assertArgFn(module, 'module');
|
||||
}
|
||||
});
|
||||
return runBlocks;
|
||||
}
|
||||
|
||||
////////////////////////////////////
|
||||
|
|
|
|||
2
src/angular-mocks.js
vendored
2
src/angular-mocks.js
vendored
|
|
@ -1287,7 +1287,7 @@ angular.module('ngMock', ['ng']).service({
|
|||
* Currently there is only one mock present in this module -
|
||||
* the {@link angular.module.ngMockE2E.$httpBackend e2e $httpBackend} mock.
|
||||
*/
|
||||
angular.module('ngMockE2E', ['ng']).init(function($provide) {
|
||||
angular.module('ngMockE2E', ['ng']).config(function($provide) {
|
||||
$provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ function setupModuleLoader(window) {
|
|||
* {@link angular.Module#init Module.init()}.
|
||||
* @return {angular.Module}
|
||||
*/
|
||||
return function module(name, requires, initFn) {
|
||||
return function module(name, requires, configFn) {
|
||||
if (requires && modules.hasOwnProperty(name)) {
|
||||
modules[name] = null;
|
||||
}
|
||||
|
|
@ -70,10 +70,17 @@ function setupModuleLoader(window) {
|
|||
/** @type {!Array.<Array.<*>>} */
|
||||
var invokeQueue = [];
|
||||
|
||||
var init = invokeLater('$injector', 'invoke');
|
||||
/** @type {!Array.<Function>} */
|
||||
var runBlocks = [];
|
||||
|
||||
var config = invokeLater('$injector', 'invoke');
|
||||
|
||||
/** @type {angular.Module} */
|
||||
var moduleInstance = {
|
||||
// Private state
|
||||
_invokeQueue: invokeQueue,
|
||||
_runBlocks: runBlocks,
|
||||
|
||||
/**
|
||||
* @ngdoc property
|
||||
* @name angular.Module#requires
|
||||
|
|
@ -83,7 +90,16 @@ function setupModuleLoader(window) {
|
|||
* Holds the list of modules which the injector will load before the current module is loaded.
|
||||
*/
|
||||
requires: requires,
|
||||
invokeQueue: invokeQueue,
|
||||
|
||||
/**
|
||||
* @ngdoc property
|
||||
* @name angular.Module#name
|
||||
* @propertyOf angular.Module
|
||||
* @returns {string} Name of the module.
|
||||
* @description
|
||||
*/
|
||||
name: name,
|
||||
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
|
|
@ -131,18 +147,32 @@ function setupModuleLoader(window) {
|
|||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name angular.Module#init
|
||||
* @name angular.Module#config
|
||||
* @methodOf angular.Module
|
||||
* @param {Function} initializationFn Execute this function on module load, allowing it to do any
|
||||
* service configuration..
|
||||
* @param {Function} initializationFn Execute this function on module load. Useful for
|
||||
* service configuration.
|
||||
* @description
|
||||
* Use this method to register work which needs to be performed on module loading.
|
||||
*/
|
||||
init: init
|
||||
config: config,
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name angular.Module#run
|
||||
* @methodOf angular.Module
|
||||
* @param {Function} initializationFn Execute this function after injector creation.
|
||||
* Useful for application initialization.
|
||||
* @description
|
||||
* Use this method to register work which needs to be performed on module loading.
|
||||
*/
|
||||
run: function(block) {
|
||||
runBlocks.push(block);
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
if (initFn) {
|
||||
init(initFn);
|
||||
if (configFn) {
|
||||
config(configFn);
|
||||
}
|
||||
|
||||
return moduleInstance;
|
||||
|
|
|
|||
|
|
@ -247,6 +247,18 @@ describe('injector', function() {
|
|||
expect(log).toEqual('abc');
|
||||
});
|
||||
|
||||
it('should execute runBlocks after injector creation', function() {
|
||||
var log = '';
|
||||
angular.module('a', [], function(){ log += 'a'; }).run(function() { log += 'A'; });
|
||||
angular.module('b', ['a'], function(){ log += 'b'; }).run(function() { log += 'B'; });
|
||||
createInjector([
|
||||
'b',
|
||||
valueFn(function() { log += 'C'; }),
|
||||
[valueFn(function() { log += 'D'; })]
|
||||
]);
|
||||
expect(log).toEqual('abABCD');
|
||||
});
|
||||
|
||||
describe('$provide', function() {
|
||||
describe('value', function() {
|
||||
it('should configure $provide values', function() {
|
||||
|
|
|
|||
|
|
@ -27,26 +27,28 @@ describe('module loader', function() {
|
|||
|
||||
it('should record calls', function() {
|
||||
var otherModule = window.angular.module('other', []);
|
||||
otherModule.init('otherInit');
|
||||
otherModule.config('otherInit');
|
||||
|
||||
var myModule = window.angular.module('my', ['other'], 'init');
|
||||
var myModule = window.angular.module('my', ['other'], 'config');
|
||||
|
||||
myModule.
|
||||
expect(myModule.
|
||||
service('sk', 'sv').
|
||||
factory('fk', 'fv').
|
||||
value('k', 'v').
|
||||
filter('f', 'ff').
|
||||
init('init2');
|
||||
config('init2').
|
||||
run('runBlock')).toBe(myModule);
|
||||
|
||||
expect(myModule.requires).toEqual(['other']);
|
||||
expect(myModule.invokeQueue).toEqual([
|
||||
['$injector', 'invoke', ['init'] ],
|
||||
expect(myModule._invokeQueue).toEqual([
|
||||
['$injector', 'invoke', ['config'] ],
|
||||
['$provide', 'service', ['sk', 'sv'] ],
|
||||
['$provide', 'factory', ['fk', 'fv'] ],
|
||||
['$provide', 'value', ['k', 'v'] ],
|
||||
['$filterProvider', 'register', ['f', 'ff'] ],
|
||||
['$injector', 'invoke', ['init2'] ]
|
||||
]);
|
||||
expect(myModule._runBlocks).toEqual(['runBlock']);
|
||||
});
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue