- 浏览: 151001 次
- 性别:
- 来自: 福建
文章分类
最新评论
-
caibinghong:
Ahua772 写道非常好,谢谢了,但是运行的图片怎么没有加载 ...
用于WebKit的CSS诀窍 -
Ahua772:
非常好,谢谢了,但是运行的图片怎么没有加载出来呢
用于WebKit的CSS诀窍 -
caibinghong:
呃是一个方法,现在改过来了,当时考的时候没有改!现在最底层是i ...
关于innerHTML 赋值问题 -
jayrao5566:
js的正确写法不是 .innerHTML = '<op ...
关于innerHTML 赋值问题 -
caibinghong:
在JQ与EXT里都解决的挺好的。http://caibingh ...
关于innerHTML 赋值问题
Container之旅
BoxComponent继承了Component,主要是实现了设置组件的宽度、高度以及位置(相对于容器或相对于document.body),他的实现较为简单,需要注意的是:
1.BoxComponent可以通过resizeEl属性设置进行调整大小的对象,positionEl属性设置调整位置的对象,并且在render事件中进行设置,将属性封装为Ext.element对象;
2.setSize和setPosition方法是在afterRender事件中被触发的,换句话说,组件调整位置和大小是在渲染后进行的。
onRender : function(ct, position){
Ext.BoxComponent.superclass.onRender.call(this, ct, position);
if(this.resizeEl){
this.resizeEl = Ext.get(this.resizeEl);
}
if(this.positionEl){
this.positionEl = Ext.get(this.positionEl);
}
},
afterRender : function(){
Ext.BoxComponent.superclass.afterRender.call(this);
this.boxReady = true;
this.setSize(this.width, this.height);
if(this.x || this.y){
this.setPosition(this.x, this.y);
}else if(this.pageX || this.pageY){
this.setPagePosition(this.pageX, this.pageY);
}
}
Ext.Containr继承了BoxComponent,在他的initComponent方法中,增加了对以下事件的支持:
'afterlayout','beforeadd','beforeremove','add','remove'。
Container主要实现了对layout和items的管理。
首先,让我们看一下Container对于items的管理:
你可能会发现大部分的Widget都支持在构建器中传入一个items数组以非常方便的形式构建该Widget的子组件,而该数组大部分情况是由json构成,让我们看个例子:
new Ext.menu.Menu({
id: 'mainMenu',
items: [
{
text: 'I like Ext',
checked: true, // when checked has a boolean value, it is assumed to be
a CheckItem
checkHandler: onItemCheck
},
{
text: 'Ext for jQuery',
checked: true,
checkHandler: onItemCheck
},
{
text: 'I donated!',
checked:false,
checkHandler: onItemCheck
}, '-', ...
那么,这些json对象看不到表示任何对象类型的属性(xtype),Widget是怎样正确解析这些json对象的呢? 魔术就发生在Container中,首先,在Container的构建器中,有如下的语句:
var items = this.items;//如果传递了items对象
if(items){
delete this.items;
if(items instanceof Array){//items对象可以是数组,也许这样写更清楚些:this.add(items)
this.add.apply(this, items);
}else{
this.add(items);
}
}
实际上,大多Widget都有自己的缺省的add的实现以满足自身的要求,Container也提供了一个缺省的add方法的实现如下:
add : function(comp){
if(!this.items){//如果未实现items数组,创建items数组
this.initItems();
}
var a = arguments, len = a.length;//如果传入的是数组则对每个元素进行递归调用add方法
if(len > 1){
for(var i = 0; i < len; i++) {
this.add(a);
}
return;
}
//this.applyDefaults(comp)方法对元素设置了缺省属性,注意到此时为止,还没有生成相应的组件,现在的item对象依然还是一个简单的json对象。lookupComponent方法则会生成元素组件
var c = this.lookupComponent(this.applyDefaults(comp));
var pos = this.items.length;
if(this.fireEvent('beforeadd', this, c, pos) !== false &&
this.onBeforeAdd(c) !== false){
this.items.add(c);
//把每个子元素的ownerCt设置成Container自己
c.ownerCt = this;
//触发add事件
this.fireEvent('add', this, c, pos);
}
return c;
},
让我们看一下lookupComponent方法的实现:
lookupComponent : function(comp){
if(typeof comp == 'string'){
如果传入的是字符串,进行查找
return Ext.ComponentMgr.get(comp);
}else if(!comp.events){
//如果是对象,但不是继承自Observable的对象(在这里,即不是Widget组件对象),则新建一个对象,这就是我们前面讨论的情况,传入的是配置数组。
return this.createComponent(comp);
}
return comp;
},
魔术的答案在这里,createComponent
方法的实现:
createComponent : function(config){
//this.defaultType是"panel",Container缺省实现是根据传入的json对象创建相应的panel
return Ext.ComponentMgr.create(config, this.defaultType);
},
而ComponentMgr的create方法的实现也很简单:
create : function(config, defaultType){
return new types[config.xtype || defaultType](config);
}
最终,秘密揭晓,Container的缺省实现将根据传入的items数组中的每个item的xtype属性进行子元素的创建。如果在item中未指定xtype,则根据配置创建panel.
Ext.Container除了通过add()方法,还提供了insert(),remove()等方法实现了对items的维护。在item中的每个元素被加入items之前,都调用beforeAdd方法,如果返回值为true,则该元素元素被设置缺省属性(通过applyDefaults方法),并吧ownerCt属性赋为container,然后加入items,并触发add事件。
Container还提供了两个很有用的方法:bubble和cascade。
bubble方法实现了一个方法在父容器中的递归调用,当然,只要方法在任何一个父容器中返回false,则调用被终止;
cascade方法则实现了方法在容器的子元素中被调用;
需要指出的是,如果未设置任何layout,则container返回ContainerLayout:
getLayout : function(){
if(!this.layout){
var layout = new Ext.layout.ContainerLayout(this.layoutConfig);
this.setLayout(layout);
}
return this.layout;
}
让我们再看一下对于layout的管理,通过render方法,Container设置了layout对象并调用了doLayout方法:
render : function(){
Ext.Container.superclass.render.apply(this, arguments);
if(this.layout){
if(typeof this.layout == 'string'){
this.layout = new
Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig);
}
this.setLayout(this.layout);
if(this.activeItem !== undefined){
var item = this.activeItem;
delete this.activeItem;
this.layout.setActiveItem(item);
return;
}
}
if(!this.ownerCt){
this.doLayout();
}
if(this.monitorResize === true){
Ext.EventManager.onWindowResize(this.doLayout, this);
}
}
doLayout方法则调用自己的layout对象的layout方法并遍历items中的元素,逐个调用layout方法:
if(this.rendered && this.layout){
this.layout.layout();
}
if(this.items){
var cs = this.items.items;
for(var i = 0, len = cs.length; i < len; i++) {
var c = cs;
if(c.doLayout){
c.doLayout();
}
}
}
发表评论
-
gulp独立分文件夹打包
2018-12-27 09:04 1497dazi.91uu.net 是如何打包资源文件呢。 基本的 ... -
定义文档兼容性,让IE按指定的版本解析我们的页面
2013-10-19 11:00 887使用文档兼容性的方法比较容易,就是在我们要反馈给客户端的HT ... -
js 删除数组几种方法
2013-09-20 22:40 833var arr=['a','b ... -
减少图片请求,分批加载图片
2013-09-14 09:35 1248var lazyLoad = { Init: ... -
flash重复请求加载问题
2013-09-07 10:55 768flash重复请求加载问题 当一个div里头放一个f ... -
新一代 javascript 模板引擎 artTemplate ,使用中的问题
2013-09-06 15:44 1167artTemplate 新一代 javascript ... -
jQuery.event自定义事件机制-jQuery.event.special范例
2013-08-16 17:19 805什么时候要用到自定义函数?有些浏览器并不兼容某类型的事件, ... -
javascript对数组的操作
2013-07-30 14:32 8191. shift:删除原数组第一项,并返回删除元素的值;如 ... -
web应用的优化规则
2012-12-20 11:03 654中文 英文 1、 减少http请求 1、M ... -
如何提高网页的效率(上篇)——提高网页效率的14条准则
2012-12-20 10:29 700如何提高网页的效率(上篇)——提高网页效率的14条准则 ... -
谈iframe内存释放问题(转载)
2012-12-19 16:39 1282(转载)随着Ajax的发展,使用javascript的RIA应 ... -
nodeType常量与dom操作方法
2012-11-27 10:55 803接口 nodeType常量 ... -
responseXML为空?
2012-11-14 12:00 606responseXML为空? 这个问题困住我一个月多, ... -
javascript 面向对象写法
2012-07-15 22:58 836//原型方法 function ClassA(){ } C ... -
javascript 验证 国际格式 电话号码
2012-07-03 15:38 0如,中国国际代号是0086,我们要让外国人直接和我们联系表述如 ... -
使用Fiddler提高前端工作效率 (实例篇)
2012-06-08 08:54 876在上一篇(使用Fiddler提高前端工作效率 (介绍篇) ... -
使用Fiddler提高前端工作效率 (介绍篇)
2012-06-08 08:54 926http://www.kuqin.com/webp ... -
CSS实现星状评分效果 – CSS Star Rating
2012-05-17 11:32 2398CSS实现星状评分效果 – CSS Star Ratin ... -
移动平台WEB前端开发技巧汇总
2012-05-17 11:29 0原名《移动平台3G手机网站前端开发布局技巧汇总》,由武方 ... -
javascript 中的protoype的解释
2012-04-17 09:53 1037JavaScript prototype 的深度探索 ...
相关推荐
EXT4,全称为第四代扩展文件系统(Fourth Extended File System),是Linux内核中最常见的日志文件系统之一。它继承了EXT3的特性,并引入了一些重要的改进,如更大的文件系统大小、更快的挂载和卸载速度、更高效的元...
ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0
Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-详细教程Ext入门-...
spketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-ext-2.1.mxpspketdwcs-...
ext-ms-win-gdi-desktop-l1-1-0.dll 用于解决这个dll文件丢失问题,下载后将此文件放置在相关文件根目录下,即可解决丢失问题
其中,“style-ext-html-webpack-plugin”是一个特别值得关注的插件,它专门针对HTML文件的内联样式进行了优化,以提高页面加载速度和用户体验。 **一、插件概述** “style-ext-html-webpack-plugin”是针对...
openwrt软路由
Extjs中实现国际化要用到的文件ext-lang-zh_CN.js和ext-lang-en.js
Ext js-4.1.1+Ext js-4.1.0+Ext4.1.0API中文版 .
适用于树莓派4B的openwrt镜像
在网上找了几种ExtDesigner的破解方法,最后发现还是这种不错,特意上传上来备用及方便大家使用,该破解适用于ExtDesigner-1.2.0,及ExtDesigner-1.2.2-48.exe,均测试通过,下载包里含破解说明, ExtDesigner-1.2.2-...
树莓派4B固件,只编译了树莓派4B版本,注意是树莓派4B
在Android系统中,对设备进行刷机或者系统更新时,经常需要处理ext4文件系统。本文将深入探讨如何使用`ext4-utils`工具集来创建`make_ext4fs`和`simg2img`这两个关键工具,这对于理解Android系统底层工作原理以及...
EXT2(Second Extended File System)是Linux早期广泛使用的文件系统之一,主要用于存储和组织文件和目录。然而,由于Linux内核本身并不直接支持NTFS(Microsoft Windows的默认文件系统),因此,fuse-ext2这样的...
ext-3.3.1ext-3.3.1ext-3.3.1ext-3.3.1ext-3.3.1ext-3.3.1
ext-js-4.2框架ext-js-4.2框架ext-js-4.2框架ext-js-4.2框架
【标题】:“EXT Scheduler - Java”是一个基于EXTJS 6.5版本的资源调度和管理工具,它结合了Spring MVC 3.1框架在后端提供了数据处理支持。EXT Scheduler作为一个强大的前端组件,用于创建直观的甘特图,帮助企业或...
标题中的"ext-7.0.0-gpl.zip"是一个软件扩展或库的压缩包,遵循GPL(GNU General Public License)开源协议。这通常意味着它是一个免费的、可修改的软件,用户可以查看源代码并根据需要进行定制,但必须保留原始许可...
bcprov-ext-jdk16-1.45.jar资源包 ,在进行JAVA的ECC椭圆算法调用时,需要用到的jar包
openwrt-19.07.5-brcm2708-bcm2710-rpi-3-ext4-factory.img 树莓派PI B3+官方镜像