何时在AngularJS中使用$ injector

时间:2015-03-23 16:04:07

标签: javascript angularjs angularjs-injector

当我通过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';
});

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

3 个答案:

答案 0 :(得分:1)

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

我通常坚持第一次使用,但你could also use the $inject annotation喜欢这样:

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

如果要向MyController的原型添加属性并仍将其用作控制器定义,这是有意义的。

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

另请注意runconfig方法之间的区别。后者允许您使用providers,它允许您配置run方法中使用的服务(以及注入时)。

答案 1 :(得分:1)

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

1)你有循环依赖,但你确定一切都会好的。

2)你需要从它的外部获得“角度世界”的东西。

upd:@Explosion Pills提供的案例看起来很有趣。

答案 2 :(得分:1)

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

Angular只能通过函数参数的名称来识别依赖关系。当你注入$injector时,你就是在这里做的。

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

上面的开发既快速又简单,但在缩小代码时可能会遇到问题,因为变量名称可能会发生变化。

对于制作而言,一般来说,开发中的一个好习惯是使用您在some.Third.Party.Module.Factory的第二个代码示例中已有的注释。

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

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