Angularjs的IOC Inject分析

简介:

     在上一篇《Angularjs开发一些经验总结》中提到angular开发中的IOC inject优先,所以在这节将引用angularjs的注入代码来分析angularjs的注入方式。在《再谈angularjs DI(Dependency Injection)》中提到angularjs的注入方式分为3中方式,如果你还不清楚的请移步。

  1. 推断式注入:在angularjs中我们可以在我们需要注入的地方按照名称注入,这里要求参数名称必须和注入服务实例名称相同,一种名称约定,angularjs会提取参数名称查找相应DI实例注入;
  2. :标记注入:在angularjs中我们可以利用$inject标注DI注入,这里需要注入服务名称的顺序和构造参数名对应.这里可以解决以上约定的死板性;
  3. 内联注入:对于directives,factory,filter等特殊指令使用$inject标注注入使用不是那么友好,angularjs特别增加了内联注入。

    在这里我们先上今天的主角code:

复制代码
 1 /** 
 2 * @ngdoc overview 
 3 * @name AUTO 
 4 * @description 
 5 * 
 6 * Implicit module which gets automatically added to each {@link AUTO.$injector $injector}. 
 7 */ 
 8 
 9 var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; 
10 var FN_ARG_SPLIT = /,/; 
11 var FN_ARG = /^\s*(_?)(.+?)\1\s*$/; 
12 var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; 
13 function annotate(fn) { 
14   var $inject, 
15       fnText, 
16       argDecl, 
17       last; 
18 
19   if (typeof fn == 'function') { 
20     if (!($inject = fn.$inject)) { 
21       $inject = []; 
22       fnText = fn.toString().replace(STRIP_COMMENTS, ''); 
23       argDecl = fnText.match(FN_ARGS); 
24       forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){ 
25         arg.replace(FN_ARG, function(all, underscore, name){ 
26           $inject.push(name); 
27         }); 
28       }); 
29       fn.$inject = $inject; 
30     } 
31   } else if (isArray(fn)) { 
32     last = fn.length - 1; 
33     assertArgFn(fn[last], 'fn') 
34     $inject = fn.slice(0, last); 
35   } else { 
36     assertArgFn(fn, 'fn', true); 
37   } 
38   return $inject; 
39 }
复制代码

 

   在上面code中我们可够很清晰的看到首先这里会判断是不是一个'function',如果是的我们这会判断fn.$inject为空,不为空则返回此注入(标记注入),为空则会根据正则匹配获取参数列表,注入服务的名字按名注入;相反如果不是'function'而是Array的话获取前n-1的服务名称注入,这是内联注入。

 

  关于angularjs注入就到这里,在最后想说下说这代码中我们能获取的两个javascript技巧:

  1. 对于javascript是运行时解释的弱类型语言,我们无法利用c#,java类似的反射机制去获取参数信息,我们只能靠正则从javascript代码中匹配(从function.toString()).
  2. 正则的强大之处,在javascript中replace函数的强大应用:
    arg.replace(FN_ARG, function(all, underscore, name){ 
    $inject.push(name); 
    }); 

     

        关于这点可以参考《JavaScript 函数replace揭秘》。


作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2013/03/27/2983806.html


相关文章
|
4月前
|
设计模式 前端开发 测试技术
AngularJS 的依赖注入机制是怎样的?
AngularJS 的依赖注入机制是怎样的?
50 1
|
5月前
|
开发者
Angular 两种依赖注入的实现方法介绍
Angular 两种依赖注入的实现方法介绍
33 0
|
6月前
|
设计模式 JavaScript 前端开发
Angular 懒加载模块与 Combined Injector
Angular 懒加载模块与 Combined Injector
33 0
|
7月前
|
JavaScript
Angular @Inject 注解的实际应用例子和工作原理浅析
Angular @Inject 注解的实际应用例子和工作原理浅析
39 0
|
7月前
从 Angular Component 和 Directive 的实例化,谈谈 Angular forRoot 方法的命令由来
同 Angular service 的单例特性不同,Angular 组件和指令通常会被多次实例化,比如 HTML markup 中每出现一次 Component 的 selector,就会触发 Component 的一次实例化。
41 0
|
JavaScript
AngularJs错误http://errors.angularjs.org/1.2.9/$injector/unpr?p0=...
AngularJs错误http://errors.angularjs.org/1.2.9/$injector/unpr?p0=...
63 0
|
设计模式 容器
AngularJS实战之依赖注入与应用实践
AngularJS实战之依赖注入与应用实践
AngularJS实战之依赖注入与应用实践
|
测试技术
Angular jasmine单元测试框架TestBed.inject的执行原理
Angular jasmine单元测试框架TestBed.inject的执行原理
87 0
Angular jasmine单元测试框架TestBed.inject的执行原理
|
JavaScript API
Angular 依赖注入框架里 useExisting 和 useClass 的使用场景
Angular 依赖注入框架里 useExisting 和 useClass 的使用场景
280 0
Angular 依赖注入框架里 useExisting 和 useClass 的使用场景
|
存储 JavaScript
Angular依赖注入官方文档的学习笔记
Angular依赖注入官方文档的学习笔记
Angular依赖注入官方文档的学习笔记