首先,讓我們回憶一下對于元件的讨論:
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方法