资源描述:
《angular中$compile源码分析_angularjs》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Angular中$compile源码分析$compile,在Angular中即"编译”服务,它涉及到Angular应用的“编译”和"链接”两个阶段,根据从DOM树遍历Angular的根节点(ng-app)和已构造完毕的$rootScope对象,依次解析根节点后代,根据多种条件查找指令,并完成每个指令相关的操作(如指令的作用域,控制器绑定以及transclude等),最终返回每个指令的链接函数,并将所右指令的链接函数合成为一个处理后的链接函数,返冋给Angluar的bootstrap模块,最终启动整个应用程序。[T
2、0C]Angular的compileProvider抛开Angular的MVVM实现方式不谈,Angular给前端带来了一个软件工程的理念一依赖注入D1。依赖注入从来只是后端领域的实现机制,尤其是javaEE的spring框架。采用依赖注入的好处就是无需开发者手动创建一个对象,这减少了开发者相关的维护操作,让开发者无需关注业务逻辑相关的对象操作。那么在前端领域呢,采用依赖注入有什么与之前的开发不一样的体验呢?我认为,前端领域的依赖注入,则大大减少了命名空间的使用,如著名的YUI框架的命名空间引用方式,在极端情况下对
3、彖的引用可能会非常长。而釆用注入的方式,则消耗的仅仅是一个局部变量,好处口然可见。而且开发者仅仅需要相关的“服务”对象的名称,而不需要知道该服务的具体引用方式,这样开发者就完全集中在了对象的借口引用上,专注于业务逻辑的开发,避免了反复的查找相关的文档。前而废话一大堆,主要述是为后而的介绍做铺垫。在Angular中,依赖注入对彖的方式依赖与该对彖的Provider,正如小结标题的comp订eProvider一样,该对象提供了compile服务,可通过injector.invoke(compi1eProvider.$g
4、et,compi1eProvider)函数完成compi1e服务的获取。因此,问题转移到分析compilcProvidcr.$gct的具体实现上。compi1eProvider.$getthis・$get=['$injector',*$parse,,*$controller,,'$rootScope','$http','$intcrpolate,,function($injector,$parse,$controller,$rootScope,$http,$interpolate){•
5、••returncompile;上述代码采用了依赖注入的方式注入了$injector,$parse,$controller,$rootScope,$http,$interpolate五个服务,分别用于实现“依赖注入的注入器($injector),js代码解析器($parse),控制器服务($controller),根作用域($rootScope),http服务和指令解析服务”。compileProvider通过这几个服务单例,完成了从抽象语法树的解析到DOM树构建,作用域绑定并最终返回合成的链接
6、函数,实现了Angular应用的开启。$get方法最终返冋comp订e函数,compile函数就是$comp订e服务的具体实现。下面我们深入compile函数:functioncompilc($compilcNodcs,maxPriority){varcompositeLinkFn=compileNodes($compileNodes,maxPriority);returnfunctionpublicLinkFn(scope,cloneAttachFn,options){options二options
7、
8、{
9、};varparentBoundTranscludcFn二options.parentBoundTranscludcFn;vartranscludeControllers=options.transcludeControllers;if(parentBoundTranscludeFn&&parentBoundTranscludeFn.$$boundTransclude){parentBoundTranscludeFn二parentBoundTranscludeFn.$$boundTransclude;}var$li
10、nkNodes;if(cloneAttachFn){$linkNodes=$compi1eNodes,clone();cloncAttachFn($linkNodes,scope);}else{$linkNodes二$compileNodes;}forEach(transcludeControl1ers,function(control1er,name){$