Today I discovered that the $injector entered in config or provider is different from the $injector entered in a service, factory, or controller.
And the get() function of these $ injectors works differently.
$injector from configuration or provider, cannot get() any service! $injector.get('myService') throws Error: [$injector:unpr] Unknown provider: myService , but $injector.has('myService') returns true. It is very strange.
$injector from the service or controller is working fine.
Here is a sample code for better understanding:
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(); } } });
Here is the plunker to play
Can anyone explain why there are two different injectors?
And how can I use the $ injector from the / config provider to inject the service (after the service has been initialized, of course)?
PS I am using angular 1.3.13
source share