如何在角度js中使用显式注释注入依赖项

时间:2017-05-11 09:51:27

标签: angularjs angularjs-config

我最近在旧代码库中强制执行ng-strict-di,现在在运行应用时收到警告和错误。例如,在下面的代码中

export default angular
    .module("profile", ["ui-router"])
    .controller("profileCtrl", profileCtrl)
    .config(($translateProvider) => {
---
});

我想了解如何为config明确定义$inject 因为我得到以下错误:

function($translateProvider) is not using explicit annotation and cannot be invoked in strict mode

1 个答案:

答案 0 :(得分:0)

它想要类似的东西:

export default angular
    .module("profile", ["ui-router"])
    .controller("profileCtrl", profileCtrl)
    .config(["$translationProvider", ($translateProvider) => {---}]);

根据此页面上的文档记录: https://docs.angularjs.org/error/ $注射器/ strictdi “尝试调用未明确注释的函数或提供程序时会发生此错误,而应用程序在启用严格模式的情况下运行”

这里有一点解释: http://frontendcollisionblog.com/javascript/angularjs/2015/03/31/something-no-one-tells-you-about-minifying-angularjs-controllers-until-its-too-late.html

显式表示法是为通过代码缩小过程维护的代码功能而设计的。当javascript被缩小时,被注入的依赖项将被替换为单个字符。因此失去了引用。 Angular不会知道参数实际应该是什么值,并会引发错误。

为了解决这个问题,Angular允许显式依赖注释。使用字符串数组(即["$translationProvider", function($translateProvider)]来关联依赖关系的表示。这是有效的,因为字符串不会缩小。

第二种方法是使用$ inject属性,如下所示:

export default angular
    .module("profile", ["ui-router"])
    .controller("profileCtrl", profileCtrl)
    .config(($translateProvider) => {---});
    profileCtrl.$inject = ["$translationProvider"];

目的保持不变。依赖注射可以在缩小过程中存活下来。