开发者社区> 技术小胖子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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:

/** 
* @ngdoc overview 
* @name AUTO 
* @description 

* Implicit module which gets automatically added to each {@link AUTO.$injector $injector}. 
*/

var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; 
var FN_ARG_SPLIT = /,/; 
var FN_ARG = /^\s*(_?)(.+?)\1\s*$/; 
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; 
function annotate(fn) { 
  var $inject, 
      fnText, 
      argDecl, 
      last;

  if (typeof fn == 'function') { 
    if (!($inject = fn.$inject)) { 
      $inject = []; 
      fnText = fn.toString().replace(STRIP_COMMENTS, ''); 
      argDecl = fnText.match(FN_ARGS); 
      forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){ 
        arg.replace(FN_ARG, function(all, underscore, name){ 
          $inject.push(name); 
        }); 
      }); 
      fn.$inject = $inject; 
    } 
  } else if (isArray(fn)) { 
    last = fn.length - 1; 
    assertArgFn(fn[last], 'fn') 
    $inject = fn.slice(0, last); 
  } else { 
    assertArgFn(fn, 'fn', true); 
  } 
  return $inject; 
}

 

   在上面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揭秘》。





 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/1163249,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Angular1.5.8路由参数的使用
在Angular 1.5.8中,经常会涉及到页面的跳转,很多页面的跳转都需要带参数,在JSP项目中,可以使用 window.location.href = 'http://hostname:port?param_1=xxx&param_2=xxx#/...
1666 0
paxos协议
两将军问题 有两支军队,它们分别有一位将军领导,现在准备攻击一座修筑了防御工事的城市。 这两支军队都驻扎在那座城市的附近,分占一座山头。 一道山谷把两座山分隔开来,并且两位将军唯一的通信方式就是派各自的信使来往于山谷两边。
1866 0
AngularJs-变量
Angularjs-变量 名字 : Hello {{name}} ...
704 0
CCD和CMOS大小(尺寸)对比图
135胶片的尺寸36×24mm称为全画幅 APS胶卷有三种尺寸,H、C、P APS-H型是接近满画幅(30.3*16.6mm),长宽比为16:9 APS-C型是在上下左右各挡去一端,是长宽比为3:2,约(24.
682 0
MS project基础
文章来自 胡昊 上海交通大学工程管理研究所 2007年   1、工期、工时与资源单位 工期:指完成每项项目任务所经历的实际时间,即开始日期和结束日期之差。Project中,工期的默认单位是天。
689 0
修改project任务的默认开始时间
  一般情况下,在project新建一个项目之后,在这个项目里每新添加一个任务,它的默认开始时间都是取的本项目的创建时间。但这可能并不是我们所需要的。 其实在这里,project取的默认开始时间都是整个项目的开始时间。
943 0
AngularJS
AngularJS 是比较新的技术,版本 1.0 是在 2012 年发布的。 AngularJS 是由 Google 的员工 Miško Hevery 从 2009 年开始着手开发。 这是一个非常好的构想,该项目目前已由 Google 正式支持,有一个全职的开发团队继续开发和维护这个库。
969 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Angular从零到一
立即下载
Angular2+进阶开发实战
立即下载
低代码开发师(初级)实战教程
立即下载