2013-05-20 61 views
6

只是学习依赖注入,我想我已经开始理解它了。了解AngularJS控制器中的依赖注入

请告诉我,如果我在正确的轨道上......

例如: - 是等价的这两个人?

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

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

回答

12

首先一点澄清:

对于依赖注入,这不要紧,你是否声明使用全局函数或module.controller(...)方法的参数的控制器。依赖注入器只关心函数本身。所以你实际上问的是这两个的等价:

// First 

function MyController($scope) {} 

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

// Second 

function($scope) {} 

并且,控制功能是否匿名或不还用于注射器不要紧,上述两个本来也可能是:

// First 

function MyController($scope) {} 

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

// Second 

function MyController($scope) {} 

现在很明显,你的两个控制器之间的唯一区别是其中的一种$inject财产的存在。

而这里的实际回答你的问题:

这两个控制器几乎是相同的。两者都将收到$scope作为参数,并且功能相同。但是,如果您稍后决定缩减代码,则只有设置了$inject阵列的版本才能正常工作。这是因为如果您没有指定$inject数组,也不使用内联注释方法(http://docs.angularjs.org/guide/di#inlineannotation),那么注入器找出您感兴趣的依赖关系的唯一方法是检查函数参数的名称(将它们视为服务ID)。但是缩小会随机地命名这些参数,从而消除以这种方式识别依赖关系的机会。因此,如果您要缩小代码,则必须使用$inject数组或内联注释明确指定依赖项,否则任何版本都可以同样好。

7

如果你打算使用module.controller方法,相当于你的第一个例子是:

var app = angular.module('myApp'); 
app.controller(<controller_name>, ['$scope', function($scope) {}]); 

注意,这样我们传递了$inject字符串函数一起,因此,如果它后来得到最小化,它仍然会工作。

+0

谢谢,但似乎不工作与'$ http' ...在这里问它:http://stackoverflow.com/q/16664325 – user2283066