在此之前,自己封装自定义控件用的是这样的方式:

 Ext.define('My.XXX',{
extend: 'Ext.YYY',
xtype: 'ZZZ',
.
.
.
items:[
...
]
});

  看着官方的例子,用的是这样的方式:

 Ext.define('My.XXX',{
extend: 'Ext.YYY',
alias: 'widget.ZZZ',
initComponent: function(){
Ext.apply(this,{
...
items: []
}) ,
this.callParent();
}
});

  起初一直不了解这么写的原因,因为两者都能达到所需要的效果,所以一直以来,都想当然的认为自己封装的写法是没错的。


  结果,问题很快就出现了!

  在正在编写的程序中,使用到了"Ext.tab.Panel"来承载编写窗口,窗口是现成的,只需要在"Ext.tab.Panel"的items中动态添加一个个的编写窗口就可以了,大致的代码是这样的:

 Ext.define('My.tab',{
extend: 'Ext.tab.Panel',
xtype: 'mtab',
layout: 'fit',
frame: true,
activeTab: 0,
deferredRender: false,
defaults: {
closable: true,
},
items: [],
buttons: [{
text: "添加标签页",
handler: function(){
var index = this.ownerCt.ownerCt.items.length + 1;
console.log(index);
var tab = this.ownerCt.ownerCt.add({
title: "文件名" + index,
xtype: 'mace',
});
this.ownerCt.ownerCt.setActiveTab(tab);
}
}],
});

  代码中的"this.ownerCt.ownerCt"是为了获取当前的tab窗口对象,以便动态为其add标签页。其实一开始也很顺利:

  添加,删除都没有问题,不过很快我就发现问题了!

  首先,动态添加的新标签页永远是第一个添加的内容,而其余的标签页变成了空白。预期当中新建一个空白的编辑界面并没有出现;

  其次,当建立了几个标签页后,把所有标签页关闭再添加时,就出现了错误,同时添加按钮也消失了。

  关于这个错误有点莫名奇妙,在网上查找这个错误时,遇到类似情况的人很多,不过导致的原因各有不同,给出的方案也是大同小异,有的说可能包导入错误,另外的说法有些靠谱,意思是控件没有关闭,只是隐藏,需要手动将需要关闭的控件销毁"destroy()",于是我又将注意力转向销毁预关闭控件的方向上,各种尝试各种查资料,结果花费了大量时间,还是没有完美的解决问题。

  最后,偶然在一个网页里,看到了他用官方那种写法,将所有属性都用Ext.apply()给包起来,然后他的问题解决了。虽然他的问题和我遇到的问题差之过远,不过我还是决定试一试。于是我将上面的封装组件改为这样:

 Ext.define('My.aceTab',{
extend: 'Ext.tab.Panel',
alias: 'widget.macetab', initComponent: function(){
Ext.apply(this,{
layout: 'fit',
frame: true,
activeTab: 0,
deferredRender: false,
defaults: {
closable: true,
},
items: [],
buttons: [{
text: "添加标签页",
handler: function(){
var index = this.ownerCt.ownerCt.items.length + 1;
var tab = this.ownerCt.ownerCt.add({
title: "文件名" + index,
id: 'aceTab' + index,
xtype: 'maceeditor',
});
this.ownerCt.ownerCt.setActiveTab(tab);
console.log(this.ownerCt.ownerCt.getActiveTab());
}
}]
}),
this.callParent();
}
});

  结果问题没有解决,然后我将封装编辑控件的自定义组件给改写:

 Ext.define('My.aceEditor',{
extend: 'Ext.panel.Panel',
alias: 'widget.maceeditor', initComponent: function(){
Ext.apply(this,{
layout: 'fit',
id: 'aceid',
items: [
Ext.create('Ext.ux.AceEditor')
]
}),
this.callParent();
}
});

  问题竟然解决了!

    

  这是什么原因呢?我继续尝试,将除了"aceEditor"以外的所有封装组件给改回了原来的形式,结果原来的问题并没有出现,说明我一开始的想法就是错误的,并不是添加tab时出现了问题,而是封装aceEditor时出问题了。


    

【ExtJS】关于标准模块化封装组件的更多相关文章

  1. Android 开发:由模块化到组件化(一)

    在Android SDK一文中,我们谈到模块化和组件化,现在我们来聊聊组件化开发背后的哪些事.最早是在广告SDK中应用组件化,但是同样适用于普通应用开发 以下高能,请做好心理准备,看不懂请发私信来交流 ...

  2. [Android Pro] 由模块化到组件化(一)

    cp from : https://blog.csdn.net/dd864140130/article/details/53645290 在Android SDK一文中,我们谈到模块化和组件化,现在我 ...

  3. Android 开发:由模块化到组件化

    在Android SDK一文中,我们谈到模块化和组件化,现在我们来聊聊组件化开发背后的哪些事.最早是在广告SDK中应用组件化,但是同样适用于普通应用开发 以下高能,请做好心理准备,看不懂请发私信来交流 ...

  4. 面试指南」JS 模块化、组件化、工程化相关的 15 道面试题

    JS 模块化.组件化.工程化相关的 15 道面试题 1.什么是模块化? 2.简述模块化的发展历程? 3.AMD.CMD.CommonJS 与 ES6 模块化的区别? 4.它们是如何使用的? 5.exp ...

  5. Vue 爬坑之路(九)—— 用正确的姿势封装组件

    迄今为止做的最大的 Vue 项目终于提交测试,天天加班的日子终于告一段落... 在开发过程中,结合 Vue 组件化的特性,开发通用组件是很基础且重要的工作 通用组件必须具备高性能.低耦合的特性 为了满 ...

  6. TagHelper+Layui封装组件之Radio单选框

    TagHelper+Layui封装组件之Radio单选框 标签名称:cl-radio 标签属性: asp-for:绑定的字段,必须指定 asp-items:绑定单选项 类型为:IEnumerable& ...

  7. [转]使用 Angular CLI 和 ng-packagr 构建一个标准的 Angular 组件库

    使用 Angular CLI 构建 Angular 应用程序是最方便的方式之一. 项目目标 现在,我们一起创建一个简单的组件库. 首先,我们需要创建一个 header 组件.这没什么特别的,当然接下来 ...

  8. iOS 模块化、组件化方案探索(利用cocoapods 、git 创建私有仓库)

    来自bang's blog http://blog.cnbang.net/tech/3080/ 模块化 简单来说,模块化就是将一个程序按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能 ...

  9. Elasticsearch for python API模块化封装

    Elasticsearch for python API模块化封装 模块的具体功能 检测Elasticsearch节点是否畅通 查询Elasticsearch节点健康状态 查询包含的关键字的日志(展示 ...

随机推荐

  1. config的配置文件

  2. python变量和简单的数据类型

    1.运行hello_world.py时发生的情况 运行hello_world.py时,Python都做了些什么呢?实际上,即便是运行简单的程序,Python所做的工作也相当多: #!/usr/bin/ ...

  3. CentOS系统中Tomcat安装配置

    Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开发而 ...

  4. 「HNOI 2014」米特运输

    题目链接 戳我 \(Describe\) 谁出的题目啊?这么长的题面,看完就滚粗了.强烈谴责 给一棵树,每个点有一个权值,要求修改一些权值,使: 一个点的权值必须是其所有儿子的权值之和 一个点的儿子权 ...

  5. 在eclipse上的hdfs的文件操作

    参考:http://dblab.xmu.edu.cn/blog/hadoop-build-project-using-eclipse/?tdsourcetag=s_pcqq_aiomsg:  http ...

  6. “全栈2019”Java第六十四章:接口与静态方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. [ActionScript 3.0] 像素级碰撞检测

    package { import flash.display.BitmapData; import flash.display.BlendMode; import flash.display.Disp ...

  8. UIScreen和UIWindow

    UIScreen 和UIWindow UIScreen object defines the properties associated with a hardware-based display 就 ...

  9. Hibernate入门教程

    Hibernate 随心所欲的使用面向对象思想操纵数据库. Table of contents 介绍 搭建开发环境 半sql半面向对象写法 完全的sql写法 完全的面向对象写法 Hibernate H ...

  10. Azure File挂载报错--System Error 1231

    背景信息: 1.Azure 虚拟机与Azure File位于同一区域 2.同一Azure File可以挂载到别的同型号的虚拟机上使用,唯独挂载到问题机器(test01)时出现如下报错:System E ...