From b630f729b2a40afc503e96490c95c3f8ea2efb78 Mon Sep 17 00:00:00 2001 From: tiny Date: Thu, 17 Nov 2016 09:20:21 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=B7=AF=E7=94=B1=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当主模块的requires数组中没有声明依赖路由模块,而路由被主模块中的依赖所依赖,那么应该重新定义路由 --- angular-async-loader.js | 48 ++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/angular-async-loader.js b/angular-async-loader.js index 06dfe75..dce6ecd 100644 --- a/angular-async-loader.js +++ b/angular-async-loader.js @@ -212,24 +212,38 @@ }]); - // rewrite $routeProvider.when - if (app.requires && app.requires.indexOf('ngRoute') !== -1) { - app.config(['$routeProvider', function($routeProvider) { - var whenFn = $routeProvider.when; - $routeProvider.when = function(path, config) { - return whenFn.call($routeProvider, path, route(config)); - }; - }]); - } - // rewrite $stateProvider.state - if (app.requires && app.requires.indexOf('ui.router') !== -1) { - app.config(['$stateProvider', function($stateProvider) { - var stateFn = $stateProvider.state; - $stateProvider.state = function(state, config) { - return stateFn.call($stateProvider, state, route(config)); - }; - }]); + + // rewrite router + function rewriteRoute(requires) { + if (requires.length == 0) { + return; + } + for (var i = 0; i < requires.length; i++) { + + //rewrite $routeProvider.when + if (requires[i] === 'ui.router') { + app.config(['$stateProvider', function ($stateProvider) { + var stateFn = $stateProvider.state; + $stateProvider.state = function (state, config) { + return stateFn.call($stateProvider, state, route(config)); + }; + }]); + } + + // rewrite $stateProvider.state + if (requires[i] === 'ngRoute') { + app.config(['$routeProvider', function ($routeProvider) { + var whenFn = $routeProvider.when; + $routeProvider.when = function (path, config) { + return whenFn.call($routeProvider, path, route(config)); + }; + }]); + } + rewriteRoute(app.module(requires[i]).requires); + + } } + rewriteRoute(app.requires); } }; } From 4770b775ac313b651a7503dcf080ddf44c21d131 Mon Sep 17 00:00:00 2001 From: tiny Date: Thu, 17 Nov 2016 10:25:55 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B3=A8=E5=86=8Cprovider=E4=B8=8E?= =?UTF-8?q?=E8=BF=90=E8=A1=8CrunBlocks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 注册模块下的providers,在处理完_invokeQueue和_configBlocks后,再处理所有模块下注册的runBlocks --- angular-async-loader.js | 51 ++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/angular-async-loader.js b/angular-async-loader.js index dce6ecd..8b4428f 100644 --- a/angular-async-loader.js +++ b/angular-async-loader.js @@ -133,26 +133,49 @@ * @param {String} name - module name */ app.useModule = function (name) { + var _runBlocks = []; + var module = angular.module(name); - if (module.requires) { - for (var i = 0; i < module.requires.length; i++) { - app.useModule(module.requires[i]); - } - } - angular.forEach(module._invokeQueue, function(args) { - var provider = ngProviders[args[0]] || $injector.get(args[0]); - provider[args[1]].apply(provider, args[2]); - }); - angular.forEach(module._configBlocks, function(args) { - var provider = ngProviders.$injector.get(args[0]); - provider[args[1]].apply(provider, args[2]); - }); - angular.forEach(module._runBlocks, function(args) { + processInvokeQueueAndConfigBlocks(module); + + /** + * when all modules has loaded, run _runBlocks + */ + angular.forEach(_runBlocks, function (args) { $injector.invoke(args); }); return app; + + function processInvokeQueueAndConfigBlocks(module) { + + if (module.requires.length > 0) { + for (var i = 0; i < module.requires.length; i++) { + processInvokeQueueAndConfigBlocks(module.requires[i]); + } + } + /** + * register providers + */ + angular.forEach(module._invokeQueue, function (args) { + //var provider = ngProviders[args[0]] || $injector.get(args[0]); + var provider = ngProviders.$injector.get(args[0]); + provider[args[1]].apply(provider, args[2]); + }); + /** + * config providers + */ + angular.forEach(module._configBlocks, function (args) { + var provider = ngProviders.$injector.get(args[0]); + provider[args[1]].apply(provider, args[2]); + }); + + /** + * concat all runBlocks + */ + [].push.apply(_runBlocks, module._runBlocks); + } }; app.value = function(name, value) {