这篇来谈谈polymer最核心的一块,也能够说是web components技术最最核心的一块内容 “生命周期”,你们在学习一些框架的时候最好都去了解一下它们的生命周期。html
什么是生命周期?故名思议,拿人的例子来讲,好比出生,上学,工做,结婚,生子,死亡等等,一辈子中几个重要阶段。组件也同样,从被建立,被解析,被赋初始化值,被添加到舞台,被绘制,被布局,使用过程当中被修改了值,被重绘,被从新布局,最终被父组件移除结束惨淡的一身等等,均可以称为组件的生命周期。web
来看看Polymer提供了那些咱们能够catch到的大事件(按触发的顺序)。。
1.created callback:当组件被 new 时调用,最先被触发,此时还不能访问组件的属性
2.ready callback :当组件内部依赖的子组件或者原生dom组件加载成功,会调用ready
3.factoryImpl callback :只有使用new ElementClass()方式建立组件时会被调用,发生在ready后
4.attached callback :组件被添加到父组件中(显示在舞台)时触发,只会触发一次框架
5.attributeChanged callback :组件被父组件设置属性时触发,只有使用setAttribute()方式设置属性才会触发,切记!(elementInstance.attr = xxx, <my-element att="xxx"></my-element>都不会触发它)
6.detached callback :当被父组件removeChild时候触发(即被移出舞台)dom
你跑一下下面的例子后,本身修修改改试一下就能大体体会,(光看文字的效果不如你本身跑一下代码)
my-element.html函数
<link rel="import" href="../bower_components/polymer/polymer.html"> <dom-module id="my-element"> <template> <p>{{name}}</p> <button on-click="handleClick">change by self</button> </template> <script> MyElement = Polymer({ is: 'my-element', properties: { name: { value: "default name", type: "String" } }, handleClick: function(){ this.setAttribute("name","name was set by parent"); }, created: function () { console.log(this.localName + '#' + this.id + ' was created'); }, attached: function () { console.log(this.localName + '#' + this.id + ' was attached'); }, detached: function () { console.log(this.localName + '#' + this.id + ' was detached'); }, attributeChanged: function (name, type) { console.log(this.localName + '#' + this.id + ' attribute ' + name + ' was changed to ' + this.getAttribute(name)); }, ready:function(){ console.log(this.localName + '#' + this.id + ' was ready'); }, factoryImpl: function(){ console.log(this.localName + '#' + this.id + ' was factoryImpl'); } }); </script> </dom-module>
parent-element.html布局
<link rel="import" href="../bower_components/polymer/polymer.html"> <link rel="import" href="my-element.html"> <dom-module id="parent-element"> <template> <my-element id="myElement" name="name was set by tag's method"></my-element> <button on-click="handleChange">change by parent</button> <button on-click="handleRemove">remove</button> </template> <script> ParentElement = Polymer({ is: 'parent-element', handleChange: function(){ var myElement = document.getElementById("myElement"); myElement.setAttribute("name","name was set by self"); }, handleRemove: function(){ //补充一下这里$符号的做用是能够用$.id的方式快速访问子组件(上面个handleChange函数则是传统方式) this.$.myElement.parentNode.removeChild(this.$.myElement); } }); </script> </dom-module>
index.html学习
<!DOCTYPE html> <html> <head> <script src="bower_components/webcomponentsjs/webcomponents-lite.min.js"></script> <link rel="import" href="components/parent-element.html"> </head> <body> <parent-element></parent-element> </body> <script> </script> </html>
控制台输出结果this
这里我只是根据官网的文档描述,大概介绍了几个主要的生命周期,可能会有遗漏(诸如layout和render在什么阶段官网文档中并无体现,或者说官方并无提供这2二个阶段供的事件接口,供用户来hack一些组件的生成,固然这仅仅是我暂时的一些推测,待继续深刻学习后会回过来一一补充。)。生命周期篇就讲到这里,下一篇咱们来聊聊Polymer的事件,也就是你们比较关心的另一个问题,组件之间的通信(消息机制)spa