再谈angularjs DI(Dependency Injection)

     在前面已经介绍了关于angularjs,以及扩展了一些jQuery ui的一些组件为angularjs的directive。在这里应进口007 上篇留言我们来看看在angularjs中的DI特性。

    DI:依赖注入,是一种软件设计模式,应DIP依赖倒置原则,描述组件之间高层组件不应该依赖于底层组件。依赖倒置是指实现和接口倒置,采用自顶向下的方式关注所需的底层组件接口,而不是其实现。其应用框架则为IOC,在.net中有很多我们熟悉的IOC框架,如Unity,Castle windsor,Ninject,Autofact等等,其常常分为构造注入,函数注入,属性注。同时在IOC和Service Locator(服务查找),如果你想更多的了解IOC和DI请参见martin fowler的Inversion of Control Containers and the Dependency Injection pattern。

     回到angularjs:在框架中为我们提供了angular.injector(modules)DI注入注射器。但是在我们使用注入的时候常常是不需要关心具体的如何注入。我们只需要按照其规则书写我们的angularjs代码就会很容易的得到angularjs的DI特性,DI方式有三种:

1:推断式注入:在angularjs中我们可以在我们需要注入的地方按照名称注入,这里要求参数名称必须和注入服务实例名称相同,一种名称约定。angularjs会提取参数名称查找相应DI实例注入。

例如:

 1 var myModule = angular.module('myModule', []);
 2 
 3 myModule.factory('$alert', function($window) {
 4 
 5     return {
 6         alert: function(text) {
 7             $window.alert(text);
 8         }
 9     };
10 });
11 
12 var myController = function($scope, $alert) {
13     $scope.message = function(msg) {
14         console.log(msg);
15         $alert.alert(msg);
16     };
17 };
18 myModule.controller("myController", myController);​

 

在上面实例我利用已知的window服务新建了一个alert的服务.并利用注入到我们的controller使用.这里采用的都是约定注入(根据参数名称注入).

jsfiddle在线演示http://jsfiddle.net/whitewolf/zyA5B/7/

 

2:标记注入:在angularjs中我们可以利用$inject标注DI注入,这里需要注入服务名称的顺序和构造参数名对应.这里可以解决以上约定的死板性.

将上例代码改变为如下:

代码如下:

 1 var myModule = angular.module('myModule', []);
 2 
 3 myModule.factory('$alert', ['$window', function($window) {
 4 
 5     return {
 6         alert: function(text) {
 7             $window.alert(text);
 8         }
 9     };}]);
10 
11 var myController = function($scope, $alert) {
12     $scope.message = function(msg) {
13         console.log(msg);
14         $alert.alert(msg);
15     };
16 };
17 myController.$inject = ['$scope', '$alert'];
18 myModule.controller("myController", myController);​

 

jsfiddle在线演示http://jsfiddle.net/whitewolf/zyA5B/8/

3:内联注入:对于directives,factory,filter等特殊指令使用$inject标注注入使用不是那么友好,angularjs特别增加了内联注入。如上面的$alert服务     

1 myModule.factory('$alert', ['$window', function($window) { 
2 
3    return { 
4        alert: function(text) { 
5        $window.alert(text); 
6     } 
7 };}]);

 

   在angularjs中我们可以在controller中实用DI特性,同时一些列的工厂方法如directives, services, filters同样可以实用内联注入得到DI特性。

1:在controller中形如:

 1 var MyController = function(dep1, dep2) {
 2 
 3 ...
 4 
 5 }
 6 
 7 MyController.$inject = ['dep1', 'dep2'];
 8 
 9  
10 
11 MyController.prototype.aMethod = function() {
12 
13 ...
14 
15 }

   

2:工厂方法注入形如:

 1 angualar.module('myModule', []).
 2 
 3 config(['depProvider', function(depProvider){
 4 
 5 ...
 6 
 7 }]).
 8 
 9 factory('serviceId', ['depService', function(depService) {
10 
11 ...
12 
13 }]).
14 
15 directive('directiveName', ['depService', function(depService) {
16 
17 ...
18 
19 }]).
20 
21 filter('filterName', ['depService', function(depService) {
22 
23 ...
24 
25 }]).
26 
27 run(['depService', function(depService) {
28 
29 ...
30 
31 }]);

 

转载于:https://www.cnblogs.com/whitewolf/archive/2012/09/11/2680659.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Access sql语句创建表及字段类型

Create TABLE 测试表 ( 文本255 VARCHAR NOT NULL, 文本20 VARCHAR(20) NOT NULL, 日期时间 DATETIME, 数字1 BYTE, 数字2 SMALLINT, 数字4 INTEGER, 布尔 BIT, 自动编号 COUNTER(10, 5) CONSTRAINT PK_TVIPLevel26 PRIMARY KEY, 小数 NUME…

c语言getc函数_C语言中的getc()函数与示例

c语言getc函数C语言中的getc()函数 (getc() function in C) Prototype: 原型: int getc(FILE *filename);Parameters: 参数: FILE *filenameReturn type: int 返回类型: int Use of function: 使用功能: In the file handling…

汇编语言-015(PROC伪指令定义参数方式、EXTERNDEF、INCLUDE 、EXTERN 、INVOKE、PROC、PROTO 、MOVSB 、MOVSD 、CMPSD )

1:使用PROC伪指令定义参数方式不通过寄存器传参,计算数组之和 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array DWORD 10000h,20000h,30000h,40000h,50000h theSum DWORD ?.code ArraySum PROC USES esi ecx,ptr…

编写计算表达式(X-Y+25)/Z的值得程序,要求将其商和余数分别放在A、B单元中。(设X和Y是32位无符号数,A、B和Z是16位无符号数,不考虑溢出情况。)

编写计算表达式(X-Y25)/Z的值得程序,要求将其商和余数分别放在A、B单元中。(设X和Y是32位无符号数,A、B和Z是16位无符号数,不考虑溢出情况。) P151 例4.8 汇编思路:首先在DATA段定…

《深入浅出WPF》笔记——绑定篇(一)

上一节,有记录写到:在WPF里,数据驱动UI,数据占核心地位,UI次之。怎么恢复数据的核心地位,那就要先了解一下Binding。 一、Binding 基础 1.1WPF中Data Binding的带来的方便 在设计架构的时间,大家…

你的代码完成了吗?(之二)——可维护性和规范性

二. 可维护性和规范性 对于代码来说,这两个属性其实是紧密相连的。什么样的代码最好维护呢?当然是规范的代码了。再差的规范也要比没有规范强得多。 之前做对日项目的时候,日本人对于“规范”这个东西(他们称之为开发规约&#xf…

c语言feof函数_使用示例的C语言中的feof()函数

c语言feof函数C语言中的feof()函数 (feof() function in C) Prototype: 原型: int feof(FILE* filename);Parameters: 参数: FILE *filenameReturn type: int(0 or 1) 返回类型: int(0或1) Use of function: 使用功能: In C l…

5种经典排序算法,每个程序员都应该知道

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 有没有想过当您应用从低到高、从高到低或按字母顺序等过滤器时,亚马逊或任何其他电子商务网站中的产品如何排序?排序算法对于此类网站起着至…

汇编语言-016(SCASB 、STOSB 、LODSD 、数组中的取值、二维数组操作、冒泡排序和二分查找、CMPSW )

1: SCASB : (字节)将AL的值与EDI寻址的一个字比较。进行在一个字符串检索特定的字符 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data alpha BYTE "ABCDEFGH",0.code main PROCmov edi,OFFSET alpha ;EDI指向字符串mov …

编写一个汇编语言程序,将字符串Hello World中的全部小写字母转换为大写字母,并存放回原地址处。

编写一个汇编语言程序,将字符串"Hello World"中的全部小写字母转换为大写字母,并存放回原地址处。 P176 4.10 编程思路:首先DATA段中,定义string存放字符串"Hello World",LEN为字符串string长度…

在Python中使用OpenCV(CV2)对图像进行边缘检测

Modules used: 使用的模块: For this, we will use the opencv-python module which provides us various functions to work on images. 为此,我们将使用opencv-python模块,该模块为我们提供了处理图像的各种功能。 Download opencv-pytho…

需保留小数点两位,但同时不要小数点后多余0的前后台代码实现

今天碰到一个需求。关于小数点的处理,看起来非常简单的事情,却花了一定时间做了一些试验。最后简单总结一下,以便备忘。 需求简化一下表达是这样的: 有A、B两列,A/BC。这3列在数据库中都以decimal存放。 在应用中&…

汇编语言-017(SCASW 、STRUCT 、STRUCT_ALLPOINTS 、STRUCT_ALIGN 、SYSTEMTIME、UNION 、 STRUCTTEST )

1:SCASW : 在wordArray中扫描16位数值0100h,将匹配元素的偏移量复制到EAX .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data wordArray WORD 0500h,0400h,0300h,0200h,0100h.code main PROCmov ax,0100hmov edi,OFFSET wordArraymov …

【笔记】正则表达式[1]

元字符 符号 意思 示范 详例 \d 任意一个数字 \d{2}-\d{8} 22-12345678 * *前的符号重复任意次数 次数可以为零 \d* 222222222222... 或 2 \s 任意的空白符 全半角空格,tab,换行符 \bhi\b\s\bLucy\b hi Lucy 和*用法相似 次数>1 \d …

编写一个汇编语言程序,完成以下要求。从BUF单元处定义有10个带符号字数据:-1,3,24,94,62,72,55,0,-48,99,试找出他们中的最大值和平均值,并以此分别存放至该数据区的后两个单元

编写一个汇编语言程序,完成以下要求。从BUF单元处定义有10个带符号字数据:-1,3,24,94,62,72,55,0,-48,99,试找出他们中的最大值和平均值,并以此分别存放至该数据区的后两个单元中(假设这10个数的和值不超过16位范围) P176 4.12 编程思路&am…

prototype 的ajax

原文:http://www.prototypejs.org/learn/introduction-to-ajax]翻 译:www.ruby-china.cn 站长]Prototype框架提供了非常容易和有意思的方法处理Ajax的调用,同时它也是浏 览器安全的 。除了简单的请求外,这个模块(指pro…

汇编语言-018(FLD 、FST、FSTP、FCHS、FABS 、浮点运算符、浮点比较 )

1:FLD : FPU(浮点处理器)的加载浮点数到堆栈指令 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array REAL8 10 DUP(?) dblOne REAL8 234.56 dblTwo REAL8 10.1.code main PROCfld array …

mcq 队列_MCQ | 基础知识 免费和开源软件| 套装4

mcq 队列Q1. What do you call the technique of storing encrypted user passwords in Linux? Q1。 您如何称呼在Linux中存储加密的用户密码的技术? System Password Management 系统密码管理 Shadow Password 影子密码 Encrypted Password 加密密码 None of the…

将AX寄存器中的16位数据分成4组(从高到低),每组4位,然后把这4组数作为数当中的低4位分别放在AL,BL,CL,DL中。

将AX寄存器中的16位数据分成4组(从高到低),每组4位,然后把这4组数作为数当中的低4位分别放在AL,BL,CL,DL中。 P176 4.14 编程思路:首先用BX、DX存放AX,即原AX原BX原DX&…

一个很不错的wp企业站模板

http://zjuhpp.com/chinese-localization-of-business-wordpress-theme-devster.html转载于:https://www.cnblogs.com/i-kyle/archive/2012/09/13/2683817.html