Ext架构分析(3)--Widget之父Component:render方法

首先,让我们回忆一下对于组件的讨论:
  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方法  }
elseExt架构分析(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方法}
elseExt架构分析(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方法
上一篇:如何用一套引擎搞定机器学习全流程?


下一篇:离线安装k8s