Extjs学习笔记之五 一个小细节renderTo和applyTo的区别


Posted in Javascript onJanuary 07, 2010

ExtJS中的renderTo和applyTo的差别

对applyTo和renderTo的理解和思考

个人认为这两篇文章写的不够通俗。写一个简单的例子来看看最终生成了什么代码,

<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如下:
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别 
如果是applyTo:button,则生成的代码为:

Extjs学习笔记之五 一个小细节renderTo和applyTo的区别

很明显,简单的说,applyTo是将组件加在了指定元素之后,而renderTo则是加在指定元素之内

接下来,我们再稍稍探寻下extjs源码的奥秘。看看extjs内部是如何使用这两个配置项的,利用firebug插件调试一下ext-all-debug.js这个文件。

在Ext.Component的构造函数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; 
}

可见applyTo属性使得Component调用applyToMarkup方法,而renderTo使得它调用render方法,并且如果两个都设置的话仅有applyTo有效,这点在extjs的文档中也有特别指出。

appylToMarkup方法如下(3.1.0版本是9560行),

applyToMarkup : function(el){ 
this.allowDomMove = false; 
this.el = Ext.get(el); 
this.render(this.el.dom.parentNode); 
}

它最终调用的也是render,不过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方法看起来比较复杂,仔细阅读下其实也不是太难,主要就是为一个DOM节点设置class,可见性,在onRender方法中会对这个组件生成相应的html代码。
对applyTo和renderTo的理解和思考 中提到的el配置属性,我查extjs的文档发现这是一个只读属性,虽然有方法覆盖它,不过一般不需要手动设置,下面是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.

所以我估计此文写的是以前版本的extjs。个人认为,el是紧包裹着extjs组件的一个DOM节点,一般是由extjs自己生成的,好像细胞膜一样,如果拨开了它,那么这个组件就不完整了,很可能会表现的不正常。而render方法中的container(也就是applyTo中指定元素的父元素,renderTo中指定的元素),是该组件的父元素,这个container中可以包括其他的html元素或者extjs组件。

综上所述,其实applyTo和renderTo没有很本质区别,只是render的位置不同。

Javascript 相关文章推荐
Javascript 实现TreeView CheckBox全选效果
Jan 11 Javascript
js点击更换背景颜色或图片的实例代码
Jun 25 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
Sep 03 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
Jun 07 Javascript
浅析ES6的八进制与二进制整数字面量
Aug 30 Javascript
详解基于angular路由的requireJs按需加载js
Jan 20 Javascript
JS实现购物车特效
Feb 02 Javascript
JavaScript之Map和Set_动力节点Java学院整理
Jun 29 Javascript
VUE 实现滚动监听 导航栏置顶的方法
Sep 11 Javascript
vue中使用codemirror的实例详解
Nov 01 Javascript
基于jQuery的时间戳与日期间的转化
Jun 21 jQuery
基于JS实现数字动态变化显示效果附源码
Jul 18 Javascript
EXT中xtype的含义分析
Jan 07 #Javascript
Extjs学习笔记之四 工具栏和菜单
Jan 07 #Javascript
Extjs学习笔记之三 extjs form更多的表单项
Jan 07 #Javascript
Extjs学习笔记之二 初识Extjs之Form
Jan 07 #Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
Jan 07 #Javascript
jQuery DOM操作小结与实例
Jan 07 #Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
Jan 05 #Javascript
You might like
PHP性能优化工具篇Benchmark类调试执行时间
2011/12/06 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
PHP异常类及异常处理操作实例详解
2018/12/19 PHP
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
JS分页效果示例
2013/10/11 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
Javascript学习笔记之数组的遍历和 length 属性
2014/11/23 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
利用JS轻松实现获取表单数据
2016/12/06 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
2017/01/04 Javascript
每个 JavaScript 工程师都应懂的33个概念
2018/10/22 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
jQuery实现颜色打字机的完整代码
2020/03/19 jQuery
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
Java文件与类动手动脑实例详解
2019/11/10 Python
使用python实现回文数的四种方法小结
2019/11/24 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
后勤园长自我鉴定
2013/10/17 职场文书
实验室标语
2014/06/21 职场文书
公司自我介绍演讲稿
2014/08/21 职场文书
大学教师师德师风演讲稿
2014/08/22 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
感谢信模板大全
2015/01/23 职场文书
郭明义电影观后感
2015/06/08 职场文书
2016党风廉政建设心得体会范文
2016/01/25 职场文书
Golang: 内建容器的用法
2021/05/05 Golang