AngularJS';s$注射器
为什么或者为什么不应该将angular的$injector本身注入,而不是将分离的、命名的依赖项作为参数注入控制器的构造函数?虽然使用$injector服务可以很好地工作,但我可以想到两个我个人永远不会这样做的原因:AngularJS';s$注射器,angularjs,Angularjs,为什么或者为什么不应该将angular的$injector本身注入,而不是将分离的、命名的依赖项作为参数注入控制器的构造函数?虽然使用$injector服务可以很好地工作,但我可以想到两个我个人永远不会这样做的原因: 这是一个完全没有必要的麻烦 它模糊了组件或组件的依赖关系 要进行说明,请参见这两者之间的区别: app.controller('myController', function($scope, myService) { }) 及 上面的两个例子做了同样的事情,但我相信第一个在意图上
app.controller('myController', function($scope, myService) {
})
及
上面的两个例子做了同样的事情,但我相信第一个在意图上要清楚得多
但是,请注意,有些情况下可能需要直接使用喷油器:存在循环依赖关系时。举个(愚蠢的)例子:
这将返回错误,因为喷油器无法在另一个喷油器之前创建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,而是仅在调用相关函数时从注入器发出请求,此时不再存在争用条件。“$injector用于检索由提供程序定义的对象实例、实例化类型、调用方法和加载模块…”这是一个实用程序问题,我特别不认为在控制器上使用此功能的原因。在某些用例中,您的依赖关系可能可用,也可能不可用,这可以通过使用
$injector
服务来实现。一个例子是$animate
服务,其中许多库使用此$injector
模式
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';
}
}
});
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';
}
}
});