何时在AngularJS中使用$injector
When to use $injector in AngularJS
当我解析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
,除非你在做一些非常花哨的事情。
还要记住run
和config
方法之间的差异。后者允许您使用提供程序,这些提供程序允许您配置run
方法中使用的服务(以及在注入服务时)。
我认为有两种情况需要通过$injector获得服务/工厂/任何东西:
1) 您有循环依赖关系,但您确信一切都会好起来。
2) 你需要从"棱角分明的世界"的外部获得一些东西。
upd:爆炸药丸提供的案例也很有趣。
- 何时在AngularJS中使用$injector
- AngularJS错误:$injector:unp未知提供程序-$modalInstanceProvider
- Error $injector:modulerr AngularJs
- AngularJS $UibModal triggering [$injector:unpr]
- AngularJS中的$injector.unpr错误
- Angularjs未捕获错误:迁移到V1.3时出现[$injector:modulerr]
- AngularJS错误:$injector:modulerr我的浏览器窗口中出现模块错误
- AngularJS-未捕获错误:[$injector:nomod]
- AngularJS with TypeScript Uncaught Error: [$injector:moduler
- AngularJS - $injector:modulerr 模块错误在 angular.js:36.
- Angularjs Error: [$injector:modulerr] 'ngRoute'
- 问题 - AngularJS 未捕获错误: [$injector:模块rr]
- AngularJS : 未捕获错误: [$injector:modulerr] 使用 angularJS 的更新版本时
- angularjs + 下载 csv 文件 + 错误: [$injector:unpr] 未知提供程序
- Angularjs $injector:unpr 在缩小后的运行方法中
- Angularjs Uncaught Error: [$injector:modulerr]
- AngularJS 0x800a139e - JavaScript 运行时错误:[$injector:modulerr]
- AngularJS:未捕获错误:带有firebase的[$injector:modulerr]
- 简单的AngularJS示例(错误:[$injector:nomod],错误:[$sinjector:modulerr]
- 错误:[$injector:unp]未知提供程序:Learning AngularJS可能使用一两个指针