如何管理不同的Angular模块依赖项

时间:2015-02-21 14:10:45

标签: javascript angularjs dependency-injection

我是Angular的新手,但随着我越来越自在,我正在编写更多的模块化代码,将更少的逻辑塞进控制器,更加独立的服务。但是我遇到的问题是我最终多次重新声明父模块,当下游声明注入的依赖项不同于前一个声明时,我遇到了冲突。

这是我目前正在做的简化版本:

<body ng-app="myApp">

//first instance of "myApp" for some controller
var myApp = angular.module('myApp', ['dep1', 'dep2']);
var someCtrl = myApp.controller('someCtrl', ['dep3','dep4']);

//later... another instance of "myApp" for another controller
if (!myApp)
    var myApp = angular.module('myApp', ['dep2']);
var anotherCtrl = myApp.controller('anotherCtrl', ['dep3','dep4']);

在这个简单的例子中重新声明myApp似乎很愚蠢,但真正的项目是一个大型的MVC PHP应用程序,有很多可重用的部分等...所以不能保证{{ 1}}总是会被包含在someCtrl之前。换句话说,我需要每个模块都是&#34;自包含&#34;,除非附加到父anotherCtrl,否则无法声明控制器/服务。

我知道是一种在以后动态(重新)注入依赖项的方法:myApp

因此,我能想到的唯一解决方案是在myApp.addDependancy(['dep7', 'dep8'])中仅使用任何潜在控制器/服务的所有可能依赖性声明myApp ...

<head>

... 从不重新声明它。这样可以更轻松地管理不同的依赖关系,但它是否基本上破坏了依赖注入的目的?因为我会注入一堆不需要的依赖项?

我是否误解了这应该如何运作?接近这个的正确方法是什么?非常欢迎链接到文档等。

注意:我还读到过度使用相同的父模块(var myApp = angular.module('myApp', ['dep1', 'dep2', 'dep3' ... ]); )是一个常见的Angular错误,但我需要控制器/服务通过相互通信myApp$rootScope等......所以我认为它们必须全部延伸$watch吗?

2 个答案:

答案 0 :(得分:0)

如何将子模块注入主体:Fiddle

angular.module("main", ['sub'])

angular.module("sub", []).controller("subctrl", function ($scope){
    $scope.hello = "hello I am sub-module";
}) 

答案 1 :(得分:0)

对于小型Angular应用,声明angular.module一次并包含所有依赖项是最好的方法。

但是,大型应用的推荐Angular设置是创建多个modules和一个主要module,这取决于其他应用。

angular.module('xmpl.service', []);
angular.module('xmpl.directive', []);
angular.module('xmpl.filter', []);

angular.module('xmpl', ['xmpl.service', 'xmpl.directive', 'xmpl.filter']);

通过此设置,您可以实现创建特定功能模块的目标,并且仍然可以使用$rootScope

请参阅此here上的官方文档。

我希望这会有所帮助。