AngularJS的依赖注入方式

在定义controller,module,service,and directive时有两种方式,git

方式一:github

var myModule = angular.module('myApp', []);
    myModule.controller('myCtrl', ['$scope', 'Project', function($scope, Project) {

    }]);

方式二:数组

var myModule = angular.module('myApp', []);
    function myCtrl($scope, Project) {

    }
myModule.controller('myCtrl', myCtrl);

这两种方式在本质上并无什么区别,不过方式二会形成做用域的污染。spa

也许你还会意识到以上两种定义方式里的依赖注入的方式也有一些不同,下面简单总结一下:插件

1.简单注入方式(Simple injection method)code

function myCtrl($scope,Project){};
myModule.controller('myCtrl', myCtrl);
//或者
myModule.controller(function($scope,Project){
})

AngularJs会扫描function的参数,提取参数的名称(name)做为function的依赖,server

因此这种方式要求保证参数名称的正确性,但对参数的顺序并无要求;blog

可是这种注入方式有一个问题,当咱们将项目发布到正式环境时都会压缩咱们的代码,这时function的参数可能会变成a,b,这就会致使咱们的代码出现问题,下面两种注入方式能够帮咱们解决这个问题。ci

2.数组注释法(array-style notation)作用域

myModule.controller('myCtrl', ['$scope', 'Preject', function($scope, Project) {
        
}])

每个依赖的参数值(字符串)都会以相同的顺序存放在一个数组里,数组的值与后面的function参数一一对应,这样即便压缩了也不会有什么问题。

若是你不喜欢这种数组注释的定义方式,下面还有一种方式。

3.显示调用function的$inject

AngularJs提供了一种向injector server通知你想要注入的依赖的方式

function myCtrl(a, b) {
    //$scope, Project,故意改为a,b模拟压缩后的情形
}
myCtrl.$inject = ['$scope', 'Project'];
myModule.controller('PhoneDetailCtrl', myCtrl);

如上,经过设置funciton的$inject属性,能够达到依赖注入的效果;

最后,有一个第三方的插件ng-min,它能够帮你将以简单方式注入的代码自动转换成数组注释的方式,即能知足你写简洁代码的愿望,又能避免压缩出错问题。

ng-min地址:https://github.com/btford/ngmin

有兴趣的朋友能够研究研究。

相关文章
相关标签/搜索