AngularJS DI用于自定义功能

时间:2013-12-07 19:00:06

标签: javascript angularjs dependency-injection

我最近一直在使用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组件之外的它?

或者我是否必须采取完全不同的方式来实现我的目标?

先进的欢呼和谢谢,

基督教

1 个答案:

答案 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
};