今日、構成またはプロバイダーに注入されることは、サービス、ファクトリ、またはコントローラーに注入されること$injector
とは異なることがわかりました。$injector
そしてget()
、この $injectors の機能は異なる動作をします。
$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();
}
}
});
2つの異なるインジェクターがある理由を誰か説明できますか?
そして、プロバイダー/構成から $injector を使用してサービスを注入するにはどうすればよいですか (もちろん、サービスが初期化された後)?
PS私はAngular 1.3.13を使用しています