在 AngularJS 中何时使用 $injector
When to use $injector in AngularJS
当我通过 AngularJS 文档进行解析时,我想我会 post 这以获得其他意见。
我的具体情况是我希望使用模块的 运行 方法更改注射剂的设置。我有几种不同的方法可以获得注射剂,但不确定使用一种方法是否比另一种方法具有明显的功能优势。或者它们归结为本质上相同的东西。
例如我的模块定义如下:
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';
});
一种方法比另一种好吗?也许还有第三种选择我还没有考虑过?
前者实际上是后者的 shorthand,但请记住,如果您缩小代码,直接引用 $injector
会导致问题,因为该变量将被重命名。您的第一次使用是防缩小的。
我通常会坚持使用第一种用法,但您 could also use the $inject
annotation 喜欢这样:
var MyController = function($scope, greeter) {
// ...
}
MyController.$inject = ['$scope', 'greeter'];
someModule.controller('MyController', MyController);
如果您想向 MyController
的原型添加属性并仍将其用作控制器定义,这很有意义。
我真的不确定是否需要直接使用 $injector
除非你正在做一些非常奇特的事情。
还要记住 run
和 config
方法之间的区别。后者允许您使用 providers,它允许您配置在 run
方法中使用的服务(以及它们何时被注入)。
我认为有两种情况需要通过 $injector:
获取 service/factory/whatever
1) 你有循环依赖,但是你确定一切都会好起来的。
2)你需要从"angular-world"外面得到一些东西。
更新:@Explosion Pills 提供的案例看起来也很有趣。
您实际上使用了三种不同的方法(据我所知)Angular 提供注入依赖项。
Angular 可以仅通过函数参数的名称来识别依赖关系。当您注入 $injector
.
时,您正在此处执行此操作
app.run(function ($injector) { ... });
以上内容对于开发来说既快速又容易,但在缩小代码时可能会 运行 出现问题,因为变量名称可能会更改。
对于生产,通常开发中的一个好的做法是使用注释,就像您在 some.Third.Party.Module.Factory
.
的第二个代码示例中已有的那样
app.run(['$injector', function ($injector) { ... }]);
我知道的第三种方法是直接使用$injector
。
这对于单元测试很有用,如果您想有条件地切换注入的依赖项。
它提供动态注释而不是静态注释。
当我通过 AngularJS 文档进行解析时,我想我会 post 这以获得其他意见。
我的具体情况是我希望使用模块的 运行 方法更改注射剂的设置。我有几种不同的方法可以获得注射剂,但不确定使用一种方法是否比另一种方法具有明显的功能优势。或者它们归结为本质上相同的东西。
例如我的模块定义如下:
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';
});
一种方法比另一种好吗?也许还有第三种选择我还没有考虑过?
前者实际上是后者的 shorthand,但请记住,如果您缩小代码,直接引用 $injector
会导致问题,因为该变量将被重命名。您的第一次使用是防缩小的。
我通常会坚持使用第一种用法,但您 could also use the $inject
annotation 喜欢这样:
var MyController = function($scope, greeter) {
// ...
}
MyController.$inject = ['$scope', 'greeter'];
someModule.controller('MyController', MyController);
如果您想向 MyController
的原型添加属性并仍将其用作控制器定义,这很有意义。
我真的不确定是否需要直接使用 $injector
除非你正在做一些非常奇特的事情。
还要记住 run
和 config
方法之间的区别。后者允许您使用 providers,它允许您配置在 run
方法中使用的服务(以及它们何时被注入)。
我认为有两种情况需要通过 $injector:
获取 service/factory/whatever1) 你有循环依赖,但是你确定一切都会好起来的。
2)你需要从"angular-world"外面得到一些东西。
更新:@Explosion Pills 提供的案例看起来也很有趣。
您实际上使用了三种不同的方法(据我所知)Angular 提供注入依赖项。
Angular 可以仅通过函数参数的名称来识别依赖关系。当您注入 $injector
.
app.run(function ($injector) { ... });
以上内容对于开发来说既快速又容易,但在缩小代码时可能会 运行 出现问题,因为变量名称可能会更改。
对于生产,通常开发中的一个好的做法是使用注释,就像您在 some.Third.Party.Module.Factory
.
app.run(['$injector', function ($injector) { ... }]);
我知道的第三种方法是直接使用$injector
。
这对于单元测试很有用,如果您想有条件地切换注入的依赖项。
它提供动态注释而不是静态注释。