重新打开并添加依赖到一个已经引导的应用程序

有没有办法将后期dependency injection已经引导的angular度模块? 这是我的意思:

假设我有一个站点范围的angular应用,定义为:

// in app.js var App = angular.module("App", []); 

并在每一页:

 <html ng-app="App"> 

稍后,我将重新打开应用程序,根据当前页面的需求添加逻辑:

 // in reports.js var App = angular.module("App") App.controller("ReportsController", ['$scope', function($scope) { // .. reports controller code }]) 

现在,说这些按需的逻辑之一也需要自己的依赖(如ngTouchngAnimatengResource等)。 我如何将它们附加到基本应用程序? 这似乎不工作:

 // in reports.js var App = angular.module("App", ['ui.event', 'ngResource']); // <-- raise error when App was already bootstrapped 

我意识到我可以提前做所有事情,即 –

 // in app.js var App = angular.module("App", ['ui.event', 'ngResource', 'ngAnimate', ...]); 

或者自己定义每个模块,然后将所有内容注入到主应用程序中( 请参阅这里了解更多信息 ):

 // in reports.js angular.module("Reports", ['ui.event', 'ngResource']) .controller("ReportsController", ['$scope', function($scope) { // .. reports controller code }]) // in home.js angular.module("Home", ['ngAnimate']) .controller("HomeController", ['$scope', '$http', function($scope, $http){ // ... }]) // in app.js, loaded last into the page (different for every page that varies in dependencies) var App = angular.module("App", ['Reports', 'Home']) 

但是,这将需要我每次与当前页面的依赖项初始化应用程序。

我更喜欢在每个页面中包含基本的app.js ,并简单地向每个页面( reports.jshome.js等)引入所需的扩展,而不必在每次添加或删除内容时都修改引导逻辑。

有没有办法引入依赖关系,当应用程序已经bootstrap? 什么是认为这种做法的惯用方法(或方法)? 我倾向于后一种解决scheme,但想看看我描述的方式是否也可以完成。 谢谢。

我解决了这个问题:

再次参考应用程序:

 var app = angular.module('app'); 

然后将新的需求推送到需求数组:

 app.requires.push('newDependency'); 

简单的…使用getter来获取模块的一个实例,如下所示:var app = angular.module(“App”);

然后添加到像这样的“需求”集合:app.requires [app.requires.length] =“ngResource”;

无论如何,这为我工作。 祝你好运!

根据Angular JS谷歌组的这个build议,这个function目前不存在。 希望核心团队决定添加这个function,可以自己使用它。

我意识到这是一个古老的问题,但是,还没有提供任何工作的答案,所以我决定分享我是如何解决它的。

解决scheme需要分叉Angular,所以你不能再使用CDN了。 但是修改很小,所以我很惊讶为什么这个function在Angular中不存在。

我跟着谷歌组的链接,这是在这个问题的其他答案之一提供的。 在那里我发现了下面的代码,它解决了这个问题:

 instanceInjector.loadNewModules = function (mods) { forEach(loadModules(mods), function(fn) { instanceInjector.invoke(fn || noop); }); }; 

当我在angular度为1.5.0的源代码(在createInjector函数内部,在return instanceInjector;语句之前)将这段代码添加到第4414行时,它使我可以在引导之后添加依赖项,如$injector.loadNewModules(['ngCookies']);

如果您希望一次添加多个依赖项,则可以按如下方式传递它们:

 <script> var app = angular.module('appName'); app.requires.push('dependencyCtrl1', 'dependencyService1'); </script>