Extjs學(xué)習(xí)筆記之五 一個(gè)小細(xì)節(jié)renderTo和applyTo的區(qū)別
對(duì)applyTo和renderTo的理解和思考
個(gè)人認(rèn)為這兩篇文章寫(xiě)的不夠通俗。寫(xiě)一個(gè)簡(jiǎn)單的例子來(lái)看看最終生成了什么代碼,
<head>
<title>RenderTo and ApplyTo</title>
<link rel="Stylesheet" type="text/css" href="ext-3.1.0/resources/css/ext-all.css" />
<script type="text/javascript" src="ext-3.1.0/adapter/ext/ext-base-debug.js"></script>
<script type="text/javascript" src="ext-3.1.0/ext-all-debug.js"></script>
<script type="text/javascript" src="ext-3.1.0/src/locale/ext-lang-zh_CN.js"></script>
<script type="text/javascript">
Ext.onReady(function() {
var button = new Ext.Button({
renderTo: 'button',
text:'OK'
});
});
</script>
</head>
<body>
<div id="button">sadfa</div>
</body>
</html>
此代碼生成的html如下:

如果是applyTo:button,則生成的代碼為:
很明顯,簡(jiǎn)單的說(shuō),applyTo是將組件加在了指定元素之后,而renderTo則是加在指定元素之內(nèi)。
接下來(lái),我們?cè)偕陨蕴綄は耬xtjs源碼的奧秘??纯磂xtjs內(nèi)部是如何使用這兩個(gè)配置項(xiàng)的,利用firebug插件調(diào)試一下ext-all-debug.js這個(gè)文件。
在Ext.Component的構(gòu)造函數(shù)Ext.Component = function(config){…}中有這樣一段代碼(3.1.0版本是9270行):
if(this.applyTo){
this.applyToMarkup(this.applyTo);
delete this.applyTo;
}else if(this.renderTo){
this.render(this.renderTo);
delete this.renderTo;
}
可見(jiàn)applyTo屬性使得Component調(diào)用applyToMarkup方法,而renderTo使得它調(diào)用render方法,并且如果兩個(gè)都設(shè)置的話僅有applyTo有效,這點(diǎn)在extjs的文檔中也有特別指出。
appylToMarkup方法如下(3.1.0版本是9560行),
applyToMarkup : function(el){
this.allowDomMove = false;
this.el = Ext.get(el);
this.render(this.el.dom.parentNode);
}
它最終調(diào)用的也是render,不過(guò)render的位置是parentNode,render方法如下(3.1.0版本是9370行)
render : function(container, position){
if(!this.rendered && this.fireEvent('beforerender', this) !== false){
if(!container && this.el){
this.el = Ext.get(this.el);
container = this.el.dom.parentNode;
this.allowDomMove = false;
}
this.container = Ext.get(container);
if(this.ctCls){
this.container.addClass(this.ctCls);
}
this.rendered = true;
if(position !== undefined){
if(Ext.isNumber(position)){
position = this.container.dom.childNodes[position];
}else{
position = Ext.getDom(position);
}
}
this.onRender(this.container, position || null);
if(this.autoShow){
this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]);
}
if(this.cls){
this.el.addClass(this.cls);
delete this.cls;
}
if(this.style){
this.el.applyStyles(this.style);
delete this.style;
}
if(this.overCls){
this.el.addClassOnOver(this.overCls);
}
this.fireEvent('render', this);
var contentTarget = this.getContentTarget();
if (this.html){
contentTarget.update(Ext.DomHelper.markup(this.html));
delete this.html;
}
if (this.contentEl){
var ce = Ext.getDom(this.contentEl);
Ext.fly(ce).removeClass(['x-hidden', 'x-hide-display']);
contentTarget.appendChild(ce);
}
if (this.tpl) {
if (!this.tpl.compile) {
this.tpl = new Ext.XTemplate(this.tpl);
}
if (this.data) {
this.tpl[this.tplWriteMode](contentTarget, this.data);
delete this.data;
}
}
this.afterRender(this.container);
if(this.hidden){
this.doHide();
}
if(this.disabled){
this.disable(true);
}
if(this.stateful !== false){
this.initStateEvents();
}
this.fireEvent('afterrender', this);
}
return this;
}
render方法看起來(lái)比較復(fù)雜,仔細(xì)閱讀下其實(shí)也不是太難,主要就是為一個(gè)DOM節(jié)點(diǎn)設(shè)置class,可見(jiàn)性,在onRender方法中會(huì)對(duì)這個(gè)組件生成相應(yīng)的html代碼。
在 對(duì)applyTo和renderTo的理解和思考 中提到的el配置屬性,我查extjs的文檔發(fā)現(xiàn)這是一個(gè)只讀屬性,雖然有方法覆蓋它,不過(guò)一般不需要手動(dòng)設(shè)置,下面是Panel的公共屬性el的文檔原文:
el : Ext.Element
The Ext.Element which encapsulates this Component. Read-only.
This will usually be a <DIV> element created by the class's onRender method, but that may be overridden using the autoEl
config.
Note: this element will not be available until this Component has been rendered.
所以我估計(jì)此文寫(xiě)的是以前版本的extjs。個(gè)人認(rèn)為,el是緊包裹著extjs組件的一個(gè)DOM節(jié)點(diǎn),一般是由extjs自己生成的,好像細(xì)胞膜一樣,如果撥開(kāi)了它,那么這個(gè)組件就不完整了,很可能會(huì)表現(xiàn)的不正常。而render方法中的container(也就是applyTo中指定元素的父元素,renderTo中指定的元素),是該組件的父元素,這個(gè)container中可以包括其他的html元素或者extjs組件。
綜上所述,其實(shí)applyTo和renderTo沒(méi)有很本質(zhì)區(qū)別,只是render的位置不同。
- extjs圖表繪制之條形圖實(shí)現(xiàn)方法分析
- extjs4圖表繪制之折線圖實(shí)現(xiàn)方法分析
- Extjs grid添加一個(gè)圖片狀態(tài)或者按鈕的方法
- ExtJS[Desktop]實(shí)現(xiàn)圖標(biāo)換行示例代碼
- 解決Extjs上傳圖片無(wú)法預(yù)覽的解決方法
- ExtJs之帶圖片的下拉列表框插件
- ExtJs使用總結(jié)(非常詳細(xì))
- 學(xué)習(xí)ExtJS Window常用方法
- Extjs中常用表單介紹與應(yīng)用
- ExtJS 簡(jiǎn)介 讓你知道extjs是什么
- ExtJS下grid的一些屬性說(shuō)明
- extjs圖形繪制之餅圖實(shí)現(xiàn)方法分析
相關(guān)文章
ExtJS TabPanel beforeremove beforeclose使用說(shuō)明
ExtJS 關(guān)閉TabPanel內(nèi)的Panel時(shí)使用TabPanel的'beforeremove’和其內(nèi)的Panel的'beforeclose’事件彈出關(guān)閉確認(rèn)提示對(duì)話框2010-03-03extjs 分頁(yè)使用jsp傳遞數(shù)據(jù)示例
extjs實(shí)現(xiàn)的分頁(yè),使用jsp傳遞數(shù)據(jù),具體實(shí)現(xiàn)過(guò)程如下,需要的朋友莫錯(cuò)過(guò)2014-07-07Extjs讓combobox寫(xiě)起來(lái)簡(jiǎn)潔又漂亮
代碼看起來(lái)簡(jiǎn)潔又漂亮是如何做到的,這篇文章主要為大家詳細(xì)介紹了Extjs如何讓combobox寫(xiě)起來(lái)更簡(jiǎn)單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01ExtJS 2.2.1的grid控件在ie6中的顯示問(wèn)題
最近在學(xué)習(xí)使用ExtJS進(jìn)行富客戶(hù)端開(kāi)發(fā)。使用ExtJS 2.2.1的grid控件時(shí),發(fā)現(xiàn)在ie6中運(yùn)行存在一個(gè)問(wèn)題2009-05-05extjs 的權(quán)限問(wèn)題 要求控制的對(duì)象是 菜單,按鈕,URL
這兩天在解決extjs 的權(quán)限問(wèn)題。要求控制的對(duì)象是 菜單,按鈕,URL2010-03-03Ext JS Grid在IE6 下寬度的問(wèn)題解決方法
Grid設(shè)置為autoWidth:true時(shí)在ie6下寬度為10000px2009-02-02ExtJS 2.0 GridPanel基本表格簡(jiǎn)明教程
ExtJS中的表格功能非常強(qiáng)大,包括了排序、緩存、拖動(dòng)、隱藏某一列、自動(dòng)顯示行號(hào)、列匯總、單元格編輯等實(shí)用功能。2010-05-05入門(mén)基礎(chǔ)學(xué)習(xí) ExtJS筆記(一)
這段時(shí)間手中項(xiàng)目已經(jīng)完成,空閑時(shí)間較多。開(kāi)始了學(xué)習(xí)ExtJs之旅。2010-11-11