只是学习依赖注入(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
数组或内联注释显式指定依赖项,否则,任何版本都将同样有效。