AngularJS - 依赖注入(Dependency Injection)
点击查看AngularJS系列目录
转载请注明出处:http://www.cnblogs.com/leosx/
依赖注入
依赖注入是软件设计模式中的一部分,用于处理组件是如何得到它说依赖的其它组件的。
Angular的注入器子系统(Angular是由多个系统组成)是负责创建组件,解决它们之间的依赖关系,并且根据它们的需要,给它们提供所需要的组件的实例。
使用依赖注入
依赖注入(DI)是贯通了整个angularjs的。当这个组件定义了,或者在module的run 方法config 方法中定义了它们,你就可以在这个module的任何地方使用这个组件了。
1、诸如:服务(service)、指令(directive)、过滤器(filter)和动画(animation)组件,都是通过注入器的工厂(factory)方法或者在构造函数中定义的。这些组件可以注入service"(服务) 或者 "value"(值)。
2、控制器(controller)就是使用构造函数的方式进行定义的。它可以注入service"(服务) 或者 "value"(值)。
3、
run方法接收一个function函数,它里面可以注入服务(service)或者值(value)亦或常量(constant),然后可以被注入到需要它们的组件当中去(注意,这里可以定义一些常量哦!)。提示:在run中,你不能注入“provider”哦!4、
config方法接收一个function函数,它可以注入"provider" and "constant"(常量)。提示:在config方法中,你不可以注入"service"(服务) 或者 "value"(值)。
工厂(factory)方法
使用factory来定义指令(directive),服务(service)或者过滤器(filter)。factory方法是注册在module(模块)下的。我们推荐你这样来定义factory:
angular.module('myModule', [])
.factory('serviceId', ['depService', function(depService) {
// ...
}])
.directive('directiveName', ['depService', function(depService) {
// ...
}])
.filter('filterName', ['depService', function(depService) {
// ...
}]);
模块儿(module)的方法
我们可以指定方法在configuration(配置环境)下运行,也可以在module(模块)的运行时,通过调用config 方法和 run 方法来运行。
angular.module('myModule', [])
.config(['depProvider', function(depProvider) {
// ...
}])
.run(['depService', function(depService) {
// ...
}]);
控制器
我们推荐如下的方式来注册一个Controller:
someModule.controller('MyController', ['$scope', 'dep1', 'dep2', function($scope, dep1, dep2) {
...
$scope.aMethod = function() {
...
}
...
}]);
不像服务一样,在应用程序中,相同的controller是可以有多个实例的哈。
依赖性的声明
在Angular中,调用一些方法都是使用注入的方式进行调用的,例如:service factory,controller。那么你就必须将它们所使用的组件给注入进去,以提供它们使用。有以下三种方式进行依赖关系的声明。
1、使用内联数组的声明方式
2、使用
$inject属性来声明3、隐式声明方式(不推荐,并且会有警告)
一、内联数组的声明方式
这是非常好的一种声明依赖性的方式。来一个例子:
someModule.controller('MyController', ['$scope', 'greeter', function($scope, greeter) {
// ...
}]);
我们使用一个数组,这个数组由两部分元素组成,一个用于声明依赖性的字符串集合和最后一个元素(这个元素是一个方法,用于自己的实现)。
二、$inject 属性进行声明
直接上个例子:
var MyController = function($scope, greeter) {
// ...
}
MyController.$inject = ['$scope', 'greeter'];
someModule.controller('MyController', MyController);
需要注意的是,$inject 数组中的依赖,必须与MyController控制器中的参数一 一对应。
三、隐式声明
注意:如果你打算使用这种方式去运行代码,你的服务的名称可能会被重命名,服务也可能会在你的应用中被玩坏。
这是最简单的一种声明方式,你只要保证你的参数名称和依赖的组件名称能对得上。
someModule.controller('MyController', function($scope, greeter) {
// ...
});
在上面的例子当中,$scope 服务和 greeter 服务会被注入到controller里面去。这种方式的一个好处就是少了依赖性声明的数组的存在。而且可以很自由的重新排列你的依赖性。
但是,这个方法在混淆和压缩后是没有发用的。是无法正常工作的。因为这些动作都会重命名你的参数。呃呃呃……
ng-annotate 工具可以方便的让你在你的应用中使用这个隐式声明模式,因为它会在进行压缩或者混淆的时候自动把你的声明方式给改成我们推荐的内联方式进行声明,如果你想使用这种方式,可能你需要使用ng-strict-di(严格模式)。
正因为这种方式要使用严格模式,我们需要很小心,所以,一般我们都不会使用这种方式。
使用严格的依赖注入
你可以把ng-strict-di 指令增加到ng-app 指令所在的元素上,来使得你的应用使用的是严格模式。
<!doctype html>
<html ng-app="myApp" ng-strict-di>
<body>
I can add: {{ 1 + 2 }}.
<script src="angular.js"></script>
</body>
</html>
严格模式下,如果你尝试使用隐式方式来声明的时候,就会抛异常。
angular.module('myApp', [])
.factory('willBreak', function($rootScope) {
// $rootScope is implicitly injected
})
.run(['willBreak', function(willBreak) {
// Angular will throw when this runs(执行到这里会报错)
}]);
如果你是使用手动方式启动应用的话,你也可以这样来使用严格模式:
angular.bootstrap(document, ['myApp'], {
strictDi: true
});

AngularJS - 依赖注入(Dependency Injection)的更多相关文章
- 控制反转Inversion of Control (IoC) 与 依赖注入Dependency Injection (DI)
控制反转和依赖注入 控制反转和依赖注入是两个密不可分的方法用来分离你应用程序中的依赖性.控制反转Inversion of Control (IoC) 意味着一个对象不会新创建一个对象并依赖着它来完成工 ...
- 简明依赖注入(Dependency Injection)
前言 这是因特奈特上面不知道第几万篇讲依赖注入(Dependency Injection)的文章,但是说明白的却寥寥无几,这篇文章尝试控制字数同时不做大多数. 首先,依赖注入的是一件很简单的事情. 为 ...
- 14.AutoMapper 之依赖注入(Dependency Injection)
https://www.jianshu.com/p/f66447282780 依赖注入(Dependency Injection) AutoMapper支持使用静态服务定位构建自定义值解析器和自定 ...
- 依赖注入 | Dependency Injection
原文链接: Angular Dependency Injection翻译人员: 铁锚翻译时间: 2014年02月10日说明: 译者认为,本文中所有名词性的"依赖" 都可以理解为 & ...
- Spring点滴七:Spring中依赖注入(Dependency Injection:DI)
Spring机制中主要有两种依赖注入:Constructor-based Dependency Injection(基于构造方法依赖注入) 和 Setter-based Dependency Inje ...
- 设计模式之————依赖注入(Dependency Injection)与控制反转(Inversion of Controller)
参考链接: 依赖注入(DI) or 控制反转(IoC) laravel 学习笔记 —— 神奇的服务容器 PHP 依赖注入,从此不再考虑加载顺序 名词解释 IoC(Inversion of Contro ...
- 理解依赖注入(Dependency Injection)
理解依赖注入 Yii2.0 使用了依赖注入的思想.正是使用这种模式,使得Yii2异常灵活和强大.千万不要以为这是很玄乎的东西,看完下面的两个例子就懂了. class SessionStorage { ...
- Spring之对象依赖关系(依赖注入Dependency Injection)
承接上篇: Spring中,如何给对象的属性赋值: 1:通过构造函数,如下所示: <!-- 1:构造函数赋初始值 --><bean id="user1" clas ...
- MVC使用StructureMap实现依赖注入Dependency Injection
使用StructureMap也可以实现在MVC中的依赖注入,为此,我们不仅要使用StructureMap注册各种接口及其实现,还需要自定义控制器工厂,借助StructureMap来生成controll ...
随机推荐
- sizeof(void)有什么用
偶然发现在C中sizeof(void)是合法的,于是,对它的作用产生了疑问.查阅资料在GNU文档中发现如下解释: In GNU C, addition and subtraction operatio ...
- kettle表输入条件参数设置
@ 获取系统信息:设置命令参数 @ 表输入:
- vue.js路由参数简单实例讲解------简单易懂
vue中,我们构建单页面应用时候,一定必不可少用到vue-router vue-router 就是我们的路由,这个由vue官方提供的插件 首先在我们项目中安装vue-router路由依赖 第一种,我们 ...
- vue中引入swiper(vue中的滑块组件vue-awesome-swiper)
第一步安装 npm install vue-awesome-swiper --save 第二部在main.js中引入 import VueAwesomeSwiper from 'vue-awesome ...
- jQuery === 面条式代码?
自从React/Vue等框架流行之后,jQuery被打上了面条式代码的标签,甚至成了"过街老鼠",好像谁还在用jQuery,谁就还活在旧时代,很多人都争先恐后地拥抱新框架,各大博客 ...
- Linux系统下C语言如何调用scalapack中的函数
在并行计算中经常需要调用scalapck(并行化的lapack)函数库里面的函数进行编程,这里简单介绍在C语言如何调用scalapck中的矩阵向量乘的函数. 注意:scalapack中的函数是用for ...
- ZXing生成条形码、二维码、带logo二维码
采用的是开源的ZXing,Maven配置如下,jar包下载地址,自己选择版本下载,顺便推荐下Maven Repository <!-- https://mvnrepository.com/art ...
- grep&正则表达式
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...
- Linux运维:安装CentOS7.2-图解
矮哥linux运维群: 93324526 笔者QQ:578843228 此篇博文针对最小化安装,和只有图解.有不懂地方,欢迎加群询问.
- (5)ES6解构赋值-函数篇
函数参数的解构赋值 function sum(x, y) { return x + y; } sum(1,2); //解构赋值 function sum([x, y]) { return x + y; ...