我尝试在angularjs中动态定义服务,正如文档所说,$provide
和$injector
是服务,因此它们应该在module.run
中是可注入的。我需要从应用程序引导中提供动态服务,这就是为什么我试图在module.run
angular.module('remote.interface',[])
.run(['$provide', '$injector', function(provide, injector){
// provide dynamically
}]);
,但这最终在一个错误:[$injector:unpr] Unknown provider: $provideProvider <- $provide
, $injector
相同的错误,如果我试图删除$提供注入。
bug在哪里?
经过一番研究,我试着这样做:
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
}]);
即使我删除了injector.get
调用,如果我尝试注入my.val
,例如,在另一个模块的控制器中,angular也会抛出同样的错误。
请查看模块的文档,并阅读示例设置中的注释,特别是这些注释。
配置
你只能在配置块中注入提供商(不是实例)
你只能在运行块中注入实例(而不是提供程序)
下面是一个在JSFiddle上正确注入$ provider和$injector的例子。
https://docs.angularjs.org/guide/moduleangular.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
});