注入名称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揭秘》。

文章结束给大家分享下程序员的一些笑话语录: 一个程序员对自己的未来很迷茫,于是去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的"
于是他去问Lippman。
Lippman说"程序员的未来就是驾驭程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的"
于是他去问Gates。
Gates说"程序员的未来就是榨取程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的"
于是他去问侯捷。
侯捷说"程序员的未来就是诱惑程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝摇摇头"唉,我的孩子,你还是别当程序员了")


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值