angular中$compile源码分析_angularjs

angular中$compile源码分析_angularjs

ID:30766682

大小:78.00 KB

页数:7页

时间:2019-01-03

angular中$compile源码分析_angularjs_第1页
angular中$compile源码分析_angularjs_第2页
angular中$compile源码分析_angularjs_第3页
angular中$compile源码分析_angularjs_第4页
angular中$compile源码分析_angularjs_第5页
资源描述:

《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){$

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。