Page 130 - AngularJS权威教程
P. 130
110 第 13 章 依赖注入
会帮助我们把属性以正确的顺序注入进去。
JavaScript的压缩器通常会将参数名改写成简单的字符,以减小源文件体积(同
时也会删除空格、空行和注释等)。如果我们不明确地描述依赖关系, AngularJS
将无法根据参数名称推断出实际的依赖关系,也就无法进行依赖注入。
13.2 显式注入声明
AngularJS提供了显式的方法来明确定义一个函数在被调用时需要用到的依赖关系。通过这
种方法声明依赖,即使在源代码被压缩、参数名称发生改变的情况下依然能够正常工作。
可以通过$inject属性来实现显式注入声明的功能。函数对象的$inject属性是一个数组,
数组元素的类型是字符串,它们的值就是需要被注入的服务的名称。
下面是示例代码:
var aControllerFactory =
function aController($scope, greeter) {
console.log("LOADED controller", greeter);
// ……控制器
};
aControllerFactory.$inject = ['$scope', 'greeter']; // Greeter服务
console.log("greeter service");
}
// 我们应用的控制器
angular.module('myApp', [])
.controller('MyController', aControllerFactory)
.factory('greeter', greeterService);
// 获取注入器并创建一个新的作用域
var injector = angular.injector(['ng', 'myApp']),
controller = injector.get('$controller'),
rootScope = injector.get('$rootScope'),
newScope = rootScope.$new();
// 调用控制器
controller('MyController', {$scope: newScope});
对于这种声明方式来讲,参数顺序是非常重要的,因为$inject数组元素的顺序必须和注入
参数的顺序一一对应。这种声明方式可以在压缩后的代码中运行,因为声明的相关信息已经和函
数本身绑定在一起了。
13.3 行内注入声明
AngularJS提供的注入声明的最后一种方式,是可以随时使用的行内注入声明。这种方式其
实是一个语法糖,它同前面提到的通过$inject属性进行注入声明的原理是完全一样的,但允许
我们在函数定义时从行内将参数传入。此外,它可以避免在定义过程中使用临时变量。
在定义一个AngularJS的对象时,行内声明的方式允许我们直接传入一个参数数组而不是一
个函数。数组的元素是字符串,它们代表的是可以被注入到对象中的依赖的名字,最后一个参数
就是依赖注入的目标函数对象本身。