我一直在阅读教程、开发指南并自己练习,但我无法将关于依赖注入的所有内容拼凑在一起。
问题:在下面链接页面的第一个代码片段中,为什么“服务”的名称位于 $inject 前面,为什么这里又使用了服务的参数?或者更好的是我缺乏理解哪些概念?我希望能够在脑海中一步一步地将它们拼凑起来,但我仍在试图了解如何准确地以这种方式编写全局定义的“服务/功能”。
http://docs.angularjs.org/guide/dev_guide.services.understanding_services
我一直在阅读教程、开发指南并自己练习,但我无法将关于依赖注入的所有内容拼凑在一起。
问题:在下面链接页面的第一个代码片段中,为什么“服务”的名称位于 $inject 前面,为什么这里又使用了服务的参数?或者更好的是我缺乏理解哪些概念?我希望能够在脑海中一步一步地将它们拼凑起来,但我仍在试图了解如何准确地以这种方式编写全局定义的“服务/功能”。
http://docs.angularjs.org/guide/dev_guide.services.understanding_services
因此,在该代码片段中,将 $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 允许代码简单地声明它的依赖关系,因此它的依赖关系可以由外部实体提供给代码,而不是假设代码从哪里获取它。这通常被称为好莱坞原则——不要打电话给我们,我们会打电话给你。
看起来您对 AngularJS 中的依赖注入缺乏深入的了解。
一旦定义了服务,就需要将其注入到将要使用它的控制器中。该页面上的两个代码示例显示了将服务注入控制器的两种不同方法。
我建议你看一下文档:AngularJS: Dependency Injection