AngularJS DI用于自定义函数

AngularJS DI for custom functions

本文关键字:自定义函数 用于 DI AngularJS      更新时间:2024-04-16

我最近在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组件之外,在完全独立的函数中使用它呢?

还是我必须走一条完全不同的道路才能实现我的目标?

干杯和感谢提前,

Christian

angularjs非常巧妙,因为它向用户公开了自己的内部服务。您正在寻找的服务是$injector

您想用来调用自定义函数的是$injector.invoke(myCustomFunction,thisForCustomFunction,{named:locals});

如果您碰巧想在angular之外调用此函数,则必须获得应用程序注入器。

var injector = angular.element(elementWithNgApp).injector();

注:

不过,调用时间可能会减少。因为注入器必须使用几个正则表达式进行注释(查找您需要的服务)。这在整个angular中不是一个问题的原因是因为它只做了一次。因为服务、工厂、提供者都是实例化的(新的)单体,它们提供了服务的闭包,以及在提供者中使用服务的任何东西

为了防止这一额外步骤,您可以在函数上提供$inject属性。。类似这样的东西:

myfunction.$inject = ['ServiceA','ServiceB'];
function myfunction(a,b){
    //a is ServiceA 
    //b is ServiceB
};