aleclofabbro
aleclofabbro

Reputation: 1699

AngularJs can't inject $provide and $injector services in module.run

I'm trying to define services dynamically in angularjs, as the docs says, $provide and $injector are services, thus they should be injectable in module.run.. I need to make the dynamic services available from app bootstrap, that's why i'm trying to define them in module.run

angular.module('remote.interface',[])
.run(['$provide', '$injector', function(provide, injector){
  // provide dynamically
}]);

but this ends up in an Error : [$injector:unpr] Unknown provider: $provideProvider <- $provide, and same eror for $injector if i try to remove $provide injection.
Where's the bug?

[EDIT]

after some research i tried something like this:

var module = angular.module('remote.interface',[])
.run([function(){
  var provide = module.provider(),
    injector = angular.injector();
    provide.value('my.val',{i:'am a value'});
    injector.get('my.val'); // this throws [$injector:unpr] Unknown provider: my.valProvider <- my.val
}]);

even if i remove the injector.get call, if i try to inject my.val, for example, in another-module's controller, angular throws the same error.

Upvotes: 2

Views: 3145

Answers (1)

David Spence
David Spence

Reputation: 8079

Have a look at the documentation for module and have a read at the comments in the example setup, particularly these comments.

config

You can only inject Providers (not instances) into config blocks

run

You can only inject instances (not Providers) into run blocks

Here is an example setup on JSFiddle injecting $provide and $injector correctly.

https://docs.angularjs.org/guide/module

angular.module('myModule', []).
  config(function(injectables) { // provider-injector
    // This is an example of config block.
    // You can have as many of these as you want.
    // You can only inject Providers (not instances)
    // into config blocks.
  }).
  run(function(injectables) { // instance-injector
    // This is an example of a run block.
    // You can have as many of these as you want.
    // You can only inject instances (not Providers)
    // into run blocks
  });

Upvotes: 6

Related Questions