AngularJS:向主模块或控制器注入依赖项?

时间:2016-01-28 19:52:51

标签: angularjs

我对某事感到困惑。必须将一些依赖项注入主模块。例如:

angular.module("app", ["ui.router", "ui.bootstrap", "toaster"]);

虽然其他一些依赖项可以注入控制器,但不需要注入主模块。例如:

angular.module("app").controller("newCtrl", ["$q", newCtrl);

我很难理解为什么。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

$q核心ng模块中的服务,符合documentation

在加载和解析angular.js文件时,ng模块中的所有服务都被引导并注册。这允许您将它们注入应用程序的任何位置。

但是,您上面列出的三个示例都是外部模块化依赖项。需要将它们显式注册到您的应用程序中,以便在$injector服务尝试解析它们时可以使用其中的组件。

答案 1 :(得分:2)

您将模块注入其他模块。

将这些模块中包含的提供者,服务和工厂注入特定控制器。

答案 2 :(得分:1)

在Angular中,您可以定义一个类似的模块:

angular.module('MyModule1', []);

注意模块函数如何获取两个参数。第二个参数是该模块依赖的其他模块的数组。此构造用于设置模块。

定义模块后,您可以将控制器,服务等连接到模块。

angular
    .module('MyModule1')
    .service('MyService1');

注意,这次只有一个参数给模块函数。这意味着您正在已经注册的模块。

假设您创建了另一个模块MyModule2,但MyModule2需要使用MyModule1定义的服务。

您只需将模块MyModule2设置为MyModule1作为其依赖项。

angular.module('MyModule2', ['MyModule1']);

现在,您想要在MyModule2中创建一个实际使用MyModule1中定义的服务MyService1的控制器(或指令或服务,无论如何)。

Angular的依赖注入(DI)的位置。您使用服务名称作为函数参数定义控制器,当Angular实例化您的控制器时,它确保找到服务实例并提供给您控制器。

angular
    .module('MyModule2')
    .controller('MyController2', function (myService1) {
        // Hey I can use myService1
        // Dependency Injection FTW!
    });