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 相关文章推荐
js识别不同浏览器基于userAgent做判断
Jul 29 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
Jan 28 Javascript
js实现简单的省市县三级联动效果实例
Feb 18 Javascript
AngularJS实现在ng-Options加上index的解决方法
Nov 03 Javascript
前端JS面试中常见的算法问题总结
Dec 23 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
Mar 19 Javascript
element-ui 限制日期选择的方法(datepicker)
May 16 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
Jun 07 Javascript
vue的token刷新处理的方法
Jul 17 Javascript
解决vue props 拿不到值的问题
Sep 11 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
Apr 28 Javascript
vue element ui validate 主动触发错误提示操作
Sep 21 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求两个文件的相对路径
2013/06/20 PHP
php实现aes加密类分享
2014/02/16 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
2019/10/12 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
Three.js基础学习教程
2017/11/16 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
Python中常见的异常总结
2018/02/20 Python
python简易实现任意位数的水仙花实例
2018/11/13 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
python实现kmp算法的实例代码
2019/04/03 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
Python中使用socks5设置全局代理的方法示例
2020/04/15 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
Python项目打包成二进制的方法
2020/12/30 Python
java关于string最常出现的面试题整理
2021/01/18 Python
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
super关键字的用法
2012/04/10 面试题
上课迟到检讨书
2014/02/19 职场文书
学校清明节活动总结
2014/07/04 职场文书
离婚协议书怎么写
2014/09/12 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
Go语言grpc和protobuf
2022/04/13 Golang
python中的random模块和相关函数详解
2022/04/22 Python