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 相关文章推荐
动态调用CSS文件的JS代码
Jul 29 Javascript
5个javascript的数字格式化函数分享
Dec 07 Javascript
js操作table示例(个人心得)
Nov 29 Javascript
jQuery学习笔记之Ajax用法实例详解
Dec 01 Javascript
限制复选框最多选择项的实现代码
May 30 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
Dec 19 Javascript
vue.js移动端app实战1:初始配置详解
Jul 24 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
Nov 10 Javascript
JS实现深度优先搜索求解两点间最短路径
Jan 17 Javascript
vue elementUI 表单校验功能之数组多层嵌套
Jun 04 Javascript
移动端手指操控左右滑动的菜单
Sep 08 Javascript
小程序如何写动态标签的实现方法
Feb 05 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
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
jquery实现手风琴效果
2015/11/20 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
基于AngularJS实现iOS8自带的计算器
2016/09/12 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
Node.js 使用流实现读写同步边读边写功能
2017/09/11 Javascript
vue和小程序项目中使用iconfont的方法
2020/05/19 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
python笔记(1) 关于我们应不应该继续学习python
2012/10/24 Python
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
Python编译成.so文件进行加密后调用的实现
2019/12/23 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
微软台湾官方网站:Microsoft台湾
2018/08/15 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
你们项目是如何进行变更控制的
2015/08/26 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
公司领导班子四风对照检查材料
2014/09/27 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
获奖感言范文
2015/07/31 职场文书
2016党员干部廉政准则学习心得体会
2016/01/20 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书
Java面试题冲刺第十八天--Spring框架3
2021/08/07 面试题
浅谈MySQL表空间回收的正确姿势
2021/10/05 MySQL
React更新渲染原理深入分析
2022/12/24 Javascript