虽然这样做很简单,但这方法在javascript混淆压缩后就行不通了,因为参数名称会被改变。这让这个方式只能对pretotyping(产品可用性原型模拟测试法,,)和demo应用有作用。
2. $inject Annotation($inject注释)
为了允许脚本压缩器重命名函数的方法后,仍然能够注入正确的服务,函数必须通过$inject属性来注释依赖。$inject属性是一个需要注入的服务的名称的数组。
var MyController = function(renamed$scope, renamedGreeter) {
...
}
//这里依赖的东东,如果不在当前的module中,它还是不认识的。
//需要在当前module中先依赖对应的module。跟之前的例子差不多。但我不知道这是不是正确的方法。
MyController.$inject = ['$scope', 'greeter'];
需要小心的是,$inject的顺序需要与函数声明的参数顺序保持一致。
这个注释方法,对于controller声明来说是有用的,因为它与函数一起指定注释信息。
3. inline Annotation(行内注释)
有时候,不方便使用$inject注释的方式,例如注释directive的时候。
例如:
someModule.factory('greeter', function($window) { ...; });
因为需要临时变量(防止压缩后不能使用),所以代码会膨胀为:
var greeterFactory = function(renamed$window) { ...; }; greeterFactory.$inject = ['$window']; someModule.factory('greeter', greeterFactory);
由于这样(代码膨胀),angular还提供了第三种注释风格:
someModule.factory('greeter', ['$window', function(renamed$window) { ...; }]);
记住,所有注释风格都是等价的,可以被用在支持injection的angular中的任何地方。
三、Where can I user DI?
DI遍及整个angular。它通常使用在controller和factory方法中。
1. DI in controllers
controller是负责(描述)应用行为的类。建议的controller声明方法是:
var MyController = function(dep1, dep2) { ... } MyController.$inject = ['dep1', 'dep2']; MyController.prototype.aMethod = function() { ... }
2. Factory methods
factory方法是负责创建大多数angular对象。例如directive、service、filter。factory方法注册在module中,建议的factory声明方法是:
angualar.module('myModule', []). config(['depProvider', function(depProvider){ ... }]). factory('serviceId', ['depService', function(depService) { ... }]). directive('directiveName', ['depService', function(depService) { ... }]). filter('filterName', ['depService', function(depService) { ... }]). run(['depService', function(depService) { ... }]);
以上就是对AngularJS Dependency Injection 的资料整理后续继续补充,谢谢大家对本站的支持!
您可能感兴趣的文章: