我爱编程

angular生命周期

2017-06-29  本文已影响0人  才気莮孒

AngularJS应用启动之前,它们是以HTML文本形式存在文本编辑器当中。应用启动会进行编译和链接,作用域会同HTML进行绑定。这个过程包含了两个阶段!

编译阶段:

在编译的阶段,angularjs会遍历整个的文档并根据JavaScript中指令定义来处理页面上什么的指令。在遍历的过程中,有可能一层套着一层,一直延深处遍历。

一但遍历和编译完毕就会返回一个叫做模板函数的函数。在这个函数没被返回(return)之前我们可以对编译后的DOM树进行修改。如果设置了compile函数,

说明我们希望在指令和实时数据被放到DOM中之前进行DOM操作,在这个函数中进行诸如添加和删除节点等DOM操作是安全的。

本质上,当我们设置了link选项,实际上是创建了一个postLink()

链接函数,以便compile() 函数可以定义链接函数。

编译函数(compile)负责对模板DOM进行转换。

链接函数(link)负责将作用域和DOM进行链接。

注:compile和link选项是互斥的。如果同时设置了这两个选项,那么会把compile所返回的函数当作链接函数,而link选项本身则会被忽略。compile: function(tEle, tAttrs, transcludeFn) {

var tplEl = angular.element('

' +'

' +'');

var h2 = tplEl.find('h2');

h2.attr('type', tAttrs.type);

h2.attr('ng-model', tAttrs.ngModel);

h2.val("hello");

tEle.replaceWith(tplEl);

return function(scope, ele, attrs) {

// 连接函数

};

}

在最后return一个闭包函数,其实就是我们的所说的link函数。平常我们这样定义的compile函数很少用,多种写法,因为写起来比较复杂。

链接阶段:

用link函数创建可以操作DOM的指令。

链接函数是可选的。如果定义了编译函数,它会返回链接函数,因此当两个函数都定义了时,编译函数会重载链接函数。(覆盖);

// require 'SomeController',

link: function(scope, element, attrs, SomeController) {

// 在这里操作DOM,可以访问required指定的控制器

}

如果require选项提供了一个指令数组,第四个参数会是一个由每个指令所对应的控制器组成的数组。

总结:

(1)compile函数的作用就是对指令的模板函数进行转换。

(2)link函数是在模型和视图之间建立关联,包括在元素上注册监听事件。

(3)scope在连接阶段才被绑定到元素上,所以在compile阶段操作scope回报错误。

(4)一般情况下,我们只写link函数就够了。

(5)请注意,如果你编写自定义的compile函数,则自定义的link函数无效应为compile会返回一个link函数

上一篇 下一篇

猜你喜欢

热点阅读