首先,让我们回忆一下对于组件的讨论:
1.只有配置了applyTo或renderTo属性才会在构建组件时立刻进行render方法的调用;
2.如果是applyTo属性,则会对component的容器进行渲染;renderTo则是对component进行渲染;
现在,让我们看一下render方法的实现:
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 render : function(container, position)
Ext架构分析(3)--Widget之父Component:render方法 {
Ext架构分析(3)--Widget之父Component:render方法 //如果还没有被渲染 并且beforerender方法返回值为true,则进行渲染,这样,确保了对于组件仅进行一次渲染; position参数指定了组件被插入容器的位置(即在position指定的元素前插入组件)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(!this.rendered && this.fireEvent("beforerender", this) !== false)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 //没有传入任何参数(即未指定容器container)并且设置了this.el,增配置this.container属性
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(!container && this.el)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 this.el = Ext.get(this.el);
Ext架构分析(3)--Widget之父Component:render方法 container = this.el.dom.parentNode;
Ext架构分析(3)--Widget之父Component:render方法 this.allowDomMove = false;
Ext架构分析(3)--Widget之父Component:render方法 }
Ext架构分析(3)--Widget之父Component:render方法 this.container = Ext.get(container);
Ext架构分析(3)--Widget之父Component:render方法 //如果配置了ctCls,对container进行ctCls的渲染,ctCls(Container Class)是容器的渲染类名,cls(Class)是元素的渲染类名
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(this.ctCls)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 this.container.addClass(this.ctCls);
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 this.rendered = true;
Ext架构分析(3)--Widget之父Component:render方法 //设置position
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(position !== undefined)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(typeof position == 'number')
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 position = this.container.dom.childNodes[position];
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 }else
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 position = Ext.getDom(position);
Ext架构分析(3)--Widget之父Component:render方法 }
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 //进行onRender方法调用
Ext架构分析(3)--Widget之父Component:render方法 this.onRender(this.container, position || null);
Ext架构分析(3)--Widget之父Component:render方法 //如果设置了autoShow,则移除x-hidden和x-hide-hideMode(根据hideMode该属性可以配置为display,visibility,offsets三种属性),从这个方法可以看出,一搬来说,组件创建后缺省的模式为hidden或者none
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(this.autoShow)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]);
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 //如果设置了cls,则对元素进行渲染
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(this.cls)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 this.el.addClass(this.cls);
Ext架构分析(3)--Widget之父Component:render方法 delete this.cls;
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 //如果设置了style,则对元素Style属性进行设置
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(this.style)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 this.el.applyStyles(this.style);
Ext架构分析(3)--Widget之父Component:render方法 delete this.style;
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 //触发fireEvent和AfterRender事件
Ext架构分析(3)--Widget之父Component:render方法 this.fireEvent("render", this);
Ext架构分析(3)--Widget之父Component:render方法 this.afterRender(this.container);
Ext架构分析(3)--Widget之父Component:render方法 //如果设置了hidden和disabled则进行相应的处理
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(this.hidden)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 this.hide();
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(this.disabled)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 this.disable();
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 this.initStateEvents();
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 return this;
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 onRender实现的方法如下:
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 onRender : function(ct, position)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 //如果配置了autoEl属性,则根据autoEl属性生成el属性, 如果autoEl属性为字符串,则根据字符串生成元素;否则,则在autoEl指定的元素外包裹一层div元素
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(this.autoEl)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(typeof this.autoEl == 'string')
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 this.el = document.createElement(this.autoEl);
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 }else
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 var div = document.createElement('div');
Ext架构分析(3)--Widget之父Component:render方法 Ext.DomHelper.overwrite(div, this.autoEl);
Ext架构分析(3)--Widget之父Component:render方法 this.el = div.firstChild;
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 //把position元素插入到el元素前
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(this.el)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 this.el = Ext.get(this.el);
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 if(this.allowDomMove !== false)
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法 ct.dom.insertBefore(this.el.dom, position);
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法
Ext架构分析(3)--Widget之父Component:render方法