AngularJS严格DI模式有什么好处?

时间:2015-11-03 07:59:10

标签: javascript angularjs dependency-injection

最近我遇到了AngularJS Strict DI模式。目的是什么?使用它的好处?我们是否会通过在移动设备上使用它来获得显着的性能提升?

我尝试将它应用于我的代码,在编写代码时我没有做任何注释。但是,我的代码要缩小,并在构建期间进行ng-annotate。但是为什么在我将严格的DI模式添加到我的代码后,我仍然会收到错误说"需要显式注释"?

4 个答案:

答案 0 :(得分:32)

严格的DI模式在运行时发现一段不符合缩小的代码时,基本上会抛出错误;但请注意,代码可能是正确的,没有逻辑语法错误。

引用文档:

  

如果app元素上存在此属性,则将在" strict-di"中创建注入器。模式。这意味着应用程序将无法调用不使用显式函数注释(因此不适合缩小)的函数,如“依赖注入指南”中所述,有用的调试信息将有助于跟踪这些错误的根源。

例如,此代码会触发错误,因为($scope, $http, $filter)未使用$inject显式注入,或者将.controller(A,B)方法作为第二个字段提供给angular.module("myApp", []) // BadController cannot be invoked, because // the dependencies to be injected are not // explicitly listed. .controller("BadController", function($scope, $http, $filter) { // ... }); 方法。

angular.module("myApp", [])
  .controller("GoodController1", GoodController1);

GoodController1.$inject = ["$scope", "$http", "$filter"];

function GoodController1($scope, $http, $filter){}

右片段:

angular.module("myApp", [])
  .controller("GoodController1", 
              ["$scope", "$http", "$filter", function ($scope, $http, $filter){
     //...
}]);

或:

$scope

为了回答您的问题,使用它并没有显着的性能提升。它只授予您微小的错误安全性。这是因为缩小会更改变量名称,例如在没有显式注释的情况下使用HTTP Post时会破坏代码。

答案 1 :(得分:6)

Angular strict DI强制执行代码可缩小性。

当您的代码缩小时,参数的名称会缩短,从而打破角度的DI。为了解决这个问题,angular已经添加了两个(现在可能更多)替代方法来添加依赖关系。

也许最常见的方式和ng-annotate使用的方法是将数组而不是函数作为第二个参数。依赖关系是数组中最后一个元素之前的字符串,字符串是依赖项名称。

controller.$inject(['$scope']);

angular.module('app', ['dependency']).controller('myCtrl', ['myFirstDep',
function(willBeInjectedHere){}])

你的ng-annotate可能在angular进行检查之前没有运行。确保你没有和注释一起运行uglify,明确地执行它。如果你的代码抛出错误,那么很可能在某处没有注释。

答案 2 :(得分:6)

您还可以像这样添加strict-di:

 angular.bootstrap(document, ['app'], {
        strictDi: true
    });

使用角度meteor es6类应用程序时。

答案 3 :(得分:4)

良好做法是使用strict-di。调用不使用显式函数注释的函数时,App必须无法运行。这意味着必须声明所使用的方法。使用ng-strict-di将确保应用程序使用依赖项注入准则进行确认,否则将无法运行。

您可以使用ng-strict-di

来实现这一目标

<html ng-app="myApp" ng-strict-di>

参见开发者指南: https://docs.angularjs.org/guide/di