为什么或为什么不应该注入angular的$ injector本身而不是将分离的,命名的依赖项作为参数注入控制器的构造函数?
答案 0 :(得分:1)
虽然使用$ injector服务可以正常工作,但我可以想到两个原因,我个人永远不会这样做:
为了说明,请看这两者之间的区别:
app.controller('myController', function($scope, myService) {
})
和
app.controller('myController', function($injector) {
var $scope = $injector.get('$scope');
var myService= $injector.get('myService');
})
上面两个例子做了同样的事情,但我相信第一个在意图上更加清晰。
请注意,有些情况下可能需要直接使用注射器:当存在循环依赖时。拿这个(愚蠢的)例子:
app.factory('service1', function(service2) {
return {
someFunction: function() {
return service2.otherFunction();
},
otherFunction: function() {
return 'result from service 1 other function';
}
}
});
app.factory('service2', function(service1) {
return {
someFunction: function() {
return service1.otherFunction();
},
otherFunction: function() {
return 'result from service 2 other function';
}
}
});
由于进样器无法在另一个之前创建service1 和 service2,因此会返回错误。在这种情况下,您可以执行以下操作:
app.factory('service1', function(service2) {
return {
someFunction: function() {
return service2.otherFunction();
},
otherFunction: function() {
return 'result from service 1 other function';
}
}
});
app.factory('service2', function($injector) {
return {
someFunction: function() {
var service1 = $injector.get('service1');
return service1.otherFunction();
},
otherFunction: function() {
return 'result from service 2 other function';
}
}
});
注意service1不再注入service2,但仅在调用相关函数时才从进样器中询问,此时不再存在竞争条件。