何时在AngularJS中使用$injector

When to use $injector in AngularJS

本文关键字:injector AngularJS 何时      更新时间:2023-09-26

当我解析AngularJS文档时,我想我会发布这篇文章来获得一些其他意见。

我的具体场景是,我希望使用模块的run方法更改可注射的设置。我有几种不同的方法可以使用注射药物,不确定使用其中一种是否有明显的功能优势。或者它们本质上是一样的。

比如说,我的模块是这样定义的:

var app = angular.module('MyModule', ['some.Third.Party.Module']);

现在考虑一下,第三方模块中有一个工厂需要设置变量。这可以通过以下操作来实现:

app.run(['some.Third.Party.Module.Factory', function (theFactory) {
    theFactory.someVariable = 'foo';
}]);

另一种方法是:

app.run(function ($injector) {
    var theFactory = $injector.get('some.Third.Party.Module.Factory');
    theFactory.someVariable = 'foo';
});

一种方法比另一种好吗?也许还有第三种选择我还没有考虑过?

您实际上使用了Angular为注入依赖项提供的三种不同方法(据我所知)。

Angular可以仅通过函数参数的名称来识别依赖项。当您注入$injector时,您在这里执行此操作。

app.run(function ($injector) { ... });

以上内容的开发既快捷又简单,但由于变量名可能会更改,因此在缩小代码时可能会遇到问题。

对于生产,通常开发中的一个好做法是使用注释,就像您在some.Third.Party.Module.Factory的第二个代码示例中已经使用的那样。

app.run(['$injector', function ($injector) { ... }]);

我知道的第三种方法是直接使用$injector。这对于单元测试很有用,如果您想有条件地切换注入的依赖项的话。它提供动态注释而不是静态注释。

前者实际上是后者的简写,但请记住,如果您缩小代码,直接引用$injector将导致问题,因为该变量将被重命名。你的第一次使用是防缩小。

我通常会坚持第一种用法,但也可以使用$inject注释,如下所示:

var MyController = function($scope, greeter) {
    // ...
}
MyController.$inject = ['$scope', 'greeter'];
someModule.controller('MyController', MyController);

如果您想将属性添加到MyController的原型中,并且仍然将其用作控制器定义,那么这是有意义的。

我真的不确定你是否需要直接使用$injector,除非你在做一些非常花哨的事情。

还要记住runconfig方法之间的差异。后者允许您使用提供程序,这些提供程序允许您配置run方法中使用的服务(以及在注入服务时)。

我认为有两种情况需要通过$injector获得服务/工厂/任何东西:

1) 您有循环依赖关系,但您确信一切都会好起来。

2) 你需要从"棱角分明的世界"的外部获得一些东西。

upd:爆炸药丸提供的案例也很有趣。