天天看點

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

繼續閱讀