发布于 2015-09-06 14:49:31 | 240 次阅读 | 评论: 0 | 来源: 网络整理
这一章节, 我们来看下在组件的生命周期来帮助我们理解, regularjs内部的运行机制.
new Component(options)
当你实例化组件时,将会发生以下剧情
对应的源码来源于Regularjs.js
options = options || {};
options.data = options.data || {};
options.events = options.events || {};
if(this.data) _.extend(options.data, this.data);
if(this.events) _.extend(options.events, this.events);
由于传入了参数true, 实例化中传入的属性会覆盖原型属性.
_.extend(this, options, true);
模板本身已经被解析过了(AST),这步跳过.
if(typeof template === 'string') this.template = new Parser(template).parse();
注册事件,可以让我们无需去实现那生命的方法(init, destory等)
if(this.events){
this.$on(this.events);
}
一般此函数我们会在config中预处理我们传入的数据
this.config && this.config(this.data);
这里的脏检查是为了确保组件视图正确, 到这里我们已经拥有初始化的dom元素, 你可以通过$refs来获取你标记的.
if(template){
this.group = this.$compile(this.template, {namespace: options.namespace});
}
$init
事件, 并调用this.init方法. __调用init之后我们不会进行自动的脏检查.
this.$emit("$init");
if( this.init ) this.init(this.data);
component.destory()
当销毁组件时,剧情就要简单的多了.
触发$destroy
事件
销毁所有模板的dom节点,并且解除所有数据绑定、指令等
需要注意的是,是Regular.prototype.destory完成了这些处理, 所以永远记得在你定义的destory函数中使用this.supr()
. 一个更稳妥的方案是: 永远不重写destroy, 而是注册$destory
事件来完成你的回收工作.