我最近一直在使用AngularJS工作,我非常喜欢依赖注入的东西。我正在整个地方使用它,但只是在Angular组件中,如控制器等。
这总是调用角度对象:
angular.module('app').controller(/**/);
现在我有了这个功能:
var custom = function(MyService) {
// do stuff
};
我已经用这种方式宣布了服务:
angular.module('app').factory('MyService', function($rootScope) {
return {
show: function() {
// do stuff
};
},
hide: function() {
// do stuff
}
};
});
我现在想在自定义函数中使用此服务。有没有办法手动调用角度DI容器? (我在文档中找不到任何内容......)
我知道这适用于未使用angular.module()...
事物定义的控制器:
function Controller(MyService) {
MyService.hide(); // works
}
但是如何在完全独立的函数中使用AngularJS组件之外的它?
或者我是否必须采取完全不同的方式来实现我的目标?
先进的欢呼和谢谢,
基督教
答案 0 :(得分:4)
angularjs非常简洁,因为它向用户公开了自己的内部服务。您正在寻找的服务是$injector
您要用来调用自定义函数的内容是$injector.invoke(myCustomFunction,thisForCustomFunction,{named:locals});
如果您想要在角度之外调用此函数,则必须获取应用程序注入器。
var injector = angular.element(elementWithNgApp).injector();
但是调用时间可能会减少。因为注入器必须使用几个正则表达式注释(找到您需要的服务)。这在整个角度中不是问题的原因是因为它完成了一次。因为服务,工厂,提供商都是实例化(新建)的单例,它们提供服务的封闭以及任何使用服务提供商内部服务的内容
要防止这个额外步骤,您可以在函数上提供$inject
属性..这样的事情:
myfunction.$inject = ['ServiceA','ServiceB'];
function myfunction(a,b){
//a is ServiceA
//b is ServiceB
};