0

我一直在阅读教程、开发指南并自己练习,但我无法将关于依赖注入的所有内容拼凑在一起。

问题:在下面链接页面的第一个代码片段中,为什么“服务”的名称位于 $inject 前面,为什么这里又使用了服务的参数?或者更好的是我缺乏理解哪些概念?我希望能够在脑海中一步一步地将它们拼凑起来,但我仍在试图了解如何准确地以这种方式编写全局定义的“服务/功能”。

http://docs.angularjs.org/guide/dev_guide.services.understanding_services

4

2 回答 2

1

因此,在该代码片段中,将 $location 服务注入 MyController。所以 MyController 依赖于 $location 所以它声明了依赖并且它拥有依赖声明。

这是注释的代码:

// declaring a Controller function
var MyController = function($location) { ... };

// $location service is required by MyController
MyController.$inject = ['$location'];

// Then register the Controller in the module.
// The module is the container that performs DI on the objects within it.
myModule.controller('MyController', MyController); 

通常,尽管您会执行以下操作来一次性声明 Controller 及其依赖项,这样会更干净。依赖项是数组前面的字符串,位于最后一个函数之前,该函数是要注册的控制器。这是更简单的定义:

myModule.controller('MyController', ['$scope', '$location', function($scope, $location) {
    $scope.someFunction = function() {
        // do something with $location service in here
    };
}]);

请记住这一点:

“……甚至是全局定义的“服务/功能”

DI 的全部意义在于不要在全局范围内定义事物,因为全局定义会产生耦合,从而难以重用系统的主要部分(即,如果不实例化整个事物,就无法拆分系统)。依赖注入将依赖(即 MyController 依赖/使用 $location 服务)与它找到该引用的位置分开。初学者开发人员,坦率地说,一些密集的高级开发人员通常只是在全局范围内定义事物,这就是一切都引用其依赖项的方式。DI 允许代码简单地声明它的依赖关系,因此它的依赖关系可以由外部实体提供给代码,而不是假设代码从哪里获取它。这通常被称为好莱坞原则——不要打电话给我们,我们会打电话给你。

于 2013-10-19T01:58:55.653 回答
0

看起来您对 AngularJS 中的依赖注入缺乏深入的了解。

一旦定义了服务,就需要将其注入到将要使用它的控制器中。该页面上的两个代码示例显示了将服务注入控制器的两种不同方法。

我建议你看一下文档:AngularJS: Dependency Injection

于 2013-10-19T01:51:33.200 回答