只是学习依赖注入(inject),我想我已经开始理解它。

请告诉我我走的路是否正确...

例如:这两个是否相等?

/* injection method */
function <controller_name>($scope) {}
<controller_name>.$inject = ['$scope'];

/* other method */
var app = angular.module('myApp');
app.controller(<controller_name>, function($scope) {});

最佳答案

首先澄清一下:

对于依赖项注入(inject),是否使用全局函数声明 Controller 或将其声明为module.controller(...)方法的参数都没有关系。依赖注入(inject)器仅关注函数本身。因此,您实际上要问的是这两个的等效性:

// First

function MyController($scope) {}

MyController.$inject = [ '$scope '];

// Second

function($scope) {}

而且由于 Controller 功能是否匿名对于注入(inject)器也无关紧要,因此以上两个同样可以:
// First

function MyController($scope) {}

MyController.$inject = [ '$scope '];

// Second

function MyController($scope) {}

现在很明显,两个 Controller 之间的唯一区别是其中一个存在$inject属性。

这是您问题的实际答案:

这两个 Controller 几乎相同。两者都将接收$scope作为参数,并且将发挥相同的作用。但是,如果您决定以后缩小代码,则只有设置了$inject数组的版本才能正常工作。这是因为,如果您未指定$inject数组,也未使用内联注释方法(http://docs.angularjs.org/guide/di#inlineannotation),则注入(inject)器找出感兴趣的依赖项的唯一方法是检查函数参数的名称(将其处理为服务ID)。但是最小化会随机命名这些参数,从而消除了以这种方式识别依赖性的机会。

因此,如果要精简代码,则必须使用$inject数组或内联注释显式指定依赖项,否则,任何版本都将同样有效。

09-10 07:09
查看更多