今天我发现,$injector
注入到配置或提供者与$injector
注入到服务、工厂或控制器不同。
这个 $ injectorsget()
的功能不同。
$injector
来自配置或提供者,不能提供get()
任何服务!$injector.get('myService')
抛出Error: [$injector:unpr] Unknown provider: myService
,但$injector.has('myService')
返回 true。这非常非常奇怪。
$injector
从服务或控制器正常工作。
这是一个代码示例,以便更好地理解:
angular.module('app', [])
.provider('myProvider', function ($injector) {
this.$get = ['$injector', function (serviceInjector) {
return {
providerInjector: $injector,
serviceInjector: serviceInjector
};
}];
})
.service('myService', function () {})
.controller('myCtrl', function ($scope, myProvider) {
var providerInjector = myProvider.providerInjector;
var serviceInjector = myProvider.serviceInjector;
console.log(providerInjector === serviceInjector); // -> false
console.log(serviceInjector.has('myService')); // `serviceInjector` has `myService`
console.log(getMyService(serviceInjector)); // `serviceInjector` can get `myService`
console.log(providerInjector.has('myService')); // `providerInjector` has `myService` too!
console.log(getMyService(providerInjector)); // but `providerInjector` can't get `myService`! =(
function getMyService(injector) {
try {
injector.get('myService');
return "OK";
} catch (e) {
return e.toString();
}
}
});
谁能解释为什么有两种不同的注射器?
以及如何使用 provider/config 中的 $injector 来注入服务(当然是在服务初始化之后)?
PS我使用角度1.3.13