renderTo和applyTo的区别

标签: EXT  JavaScript  CSS  Firebug  HTML

Extjs的组件有两个看起来类似的配置项,applyTo和renderTo,这两个配置项都是用来指定将该extjs组件加载到什么位置。那他们到底有什么区别呢?

个人认为这两篇文章写的不够通俗。

写一个简单的例子来看看最终生成了什么代码。

<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,则生成的代码为:


 很明显,简单的说,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代码。

 

个人认为:el是紧紧包裹EXT组件的一个DOM节点,一般是由EXT自己生成,好像细胞膜一样,如果拨开了它,那么整个组件就显示的不完整,很可能显示的不正常。而render中的container(也就是applyTo的父原始,renderTo中的指定元素),是该组件的父元素,这个container可以是HTML代码,亦或是EXT组件。

综上所述:applyTo和renderTo没有本质上的区别,只是renderer的位置不同。


 

 

 

版权声明:本文为iteye_2177原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iteye_2177/article/details/81894617

智能推荐

“equals“和“==“的区别

1. 功能不同 "=="是判断两个变量或实例是不是指向同一个内存空间。 "equals"是判断两个变量或实例所指向的内存空间的值是不是相同 2. 定义不同 "equals"在JAVA中是一个方法。 "=="在JAVA中只是一个运算符合。 3.比较不同 "=="是指对内存地址进行比较 "eq...

&和&&的区别

&和&&的区别 &和&&的区别 &运算符有两种用法:(1)按位与;(2)逻辑与。 &&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。&&之所以称为短路运算,是因为如果&&左边的表达式的值是 false,右边的...

CSS

1.1 CSS概述 1.1.1 为什么要使用CSS 1.1.2 案例需求: 将一个表格中所有的单元格居中,如果使用以前的方式,每个td或tr都要设置align属性为center,而使用css则方便许多。  2.1.5 CSS美化的好处: 概念:Cascading Style Sheet 层叠样式表 作用:在网页制作时可以有效地对页面布局、字体、颜色、背景和其它效果实现更加精准的控制。让H...

netty客户端引发的线程血案(一)

netty客户端引发的线程血案(一) 前言 近日,在某个项目发现线程数量持续暴涨,最后OOM的问题,开发人员很头疼,刚好来问我,就协助分析了一下,观察服务器状态,CPU使用者正常,内存消耗持续增加,socket数量正常,通过jstack看,线程数量持续增加,大量线程处于epollWait函数调用中,线程状态是RUNNABLE,线程持续增加,很不正常,了解了项目的情况,发现新增了一个功能,就是使用了...

YAML语法学习笔记

YAML 概念 YAML是一个类似 XML、JSON 的标记性语言。YAML 强调以数据为中心,并不是以标识语言为重点。因而 YAML 本身的定义比较简单,号称“一种人性化的数据格式语言”。 YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写 YAML的配置文件后缀为.yml...

猜你喜欢

图解数据结构(02) -- 链表

链表 1、什么是链表 单向链表 双向链表 链表的存储方式 2、链表的基本操作 【1】查找节点 【2】更新节点 【3】插入节点 【4】删除元素 3、数组VS链表 1、什么是链表 单向链表 链表(linkedlist)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成;单向链表的每一个节点又包含两部分,一部分是存放数据的变量 data,另一部分是指向下一个节点的指针 next 结构图...

基于ESP32的SPI读取MPU9250数据

        MPU9250集成了加速度计、陀螺仪、磁力计,能够比较精准的得到位姿信息,同时400KHZ的I2C和1MHZ的SPI让其更适用于对速度要求高的领域。         由于产品对速度的要求,我们选择采用速度更快的SPI进行读取,然而网上选择使用ESP32的SPI读取的资料很少,大多网友都选择I2C读取,官...

Dymola下的制冷剂R134A物性包的使用

本文主要讲解如何调用Modelica.Media.R134a.R134a_ph下的各类函数,进行制冷剂物性计算。 首先要明确该包的参数计算范围 0.0039 bar ≤ p ≤ 700 bar 169.85 Kelvin ≤ T ≤ 455 Kelvin explicit for pressure and specific enthalpy 参照官方文档,可以看出函数众多,...

kali linux 安装使用&&过程问题记录✍

kali linux 安装过程 kali linux 安装和汉法 kali linux 下载地址 1.直接网上下载 2.百度网盘分享 安装过程 更新源问题 1.检查是否联网 2.联网但更新源还是出错 汉化过程 部分软件的安装 SSH 配置文件修改 netwox kali linux 安装和汉法 kali linux 下载地址 1.直接网上下载 下载地址 直接点击下载就好,在这里可以也点击Torre...

实际打印纸张的横向设置不起作用的问题

在实际项目中,打印的纸张的默认一般都是纵向,但有一些是横向,但发现在一些很特殊的情况下,即使在打印之前设置了横向,但实际打印依然是纵向。目前发现这个问题有两个原因。 1 是纸张名称不对,会导致横向设置不起作用。 例如,设置为A4纸,但实际没有这种类型的纸张,或者有名称不一样,偶尔会导致即使设置了横向,但实际打印依然是纵向。也就是横向设置不起作用。 2 动态修改了打印机,也就是在弹出打印对话框时,动...