天天看点

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方法

  }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方法

继续阅读