【ExtJS】关于标准模块化封装组件
在此之前,自己封装自定义控件用的是这样的方式:
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】关于标准模块化封装组件的更多相关文章
- Android 开发:由模块化到组件化(一)
在Android SDK一文中,我们谈到模块化和组件化,现在我们来聊聊组件化开发背后的哪些事.最早是在广告SDK中应用组件化,但是同样适用于普通应用开发 以下高能,请做好心理准备,看不懂请发私信来交流 ...
- [Android Pro] 由模块化到组件化(一)
cp from : https://blog.csdn.net/dd864140130/article/details/53645290 在Android SDK一文中,我们谈到模块化和组件化,现在我 ...
- Android 开发:由模块化到组件化
在Android SDK一文中,我们谈到模块化和组件化,现在我们来聊聊组件化开发背后的哪些事.最早是在广告SDK中应用组件化,但是同样适用于普通应用开发 以下高能,请做好心理准备,看不懂请发私信来交流 ...
- 面试指南」JS 模块化、组件化、工程化相关的 15 道面试题
JS 模块化.组件化.工程化相关的 15 道面试题 1.什么是模块化? 2.简述模块化的发展历程? 3.AMD.CMD.CommonJS 与 ES6 模块化的区别? 4.它们是如何使用的? 5.exp ...
- Vue 爬坑之路(九)—— 用正确的姿势封装组件
迄今为止做的最大的 Vue 项目终于提交测试,天天加班的日子终于告一段落... 在开发过程中,结合 Vue 组件化的特性,开发通用组件是很基础且重要的工作 通用组件必须具备高性能.低耦合的特性 为了满 ...
- TagHelper+Layui封装组件之Radio单选框
TagHelper+Layui封装组件之Radio单选框 标签名称:cl-radio 标签属性: asp-for:绑定的字段,必须指定 asp-items:绑定单选项 类型为:IEnumerable& ...
- [转]使用 Angular CLI 和 ng-packagr 构建一个标准的 Angular 组件库
使用 Angular CLI 构建 Angular 应用程序是最方便的方式之一. 项目目标 现在,我们一起创建一个简单的组件库. 首先,我们需要创建一个 header 组件.这没什么特别的,当然接下来 ...
- iOS 模块化、组件化方案探索(利用cocoapods 、git 创建私有仓库)
来自bang's blog http://blog.cnbang.net/tech/3080/ 模块化 简单来说,模块化就是将一个程序按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能 ...
- Elasticsearch for python API模块化封装
Elasticsearch for python API模块化封装 模块的具体功能 检测Elasticsearch节点是否畅通 查询Elasticsearch节点健康状态 查询包含的关键字的日志(展示 ...
随机推荐
- linux mysql 权限
原文地址:http://www.cnblogs.com/eczhou/archive/2012/07/12/2588187.html Linux下mysql新建账号及权限设置 1.权限赋予 说明:my ...
- 介绍自己以及github注册流程
我叫何季生,来自网络工程141,学号是1413042027,我喜欢看一些动漫和游戏,对于编程并不是很厉害希望今年能够有所突破. github注册流程:在刚开始注册github时,我用的是qq浏览器,却 ...
- oracle数据库中修改已存在数据的字段
在oracle中,如果已经存在的数据的某些列,假如要更换类型的话,有的时候是比较麻烦的, 会出现:ORA-01439: column to be modified must be empty to c ...
- ML.NET 0.9 版本发布---.net下的机器学习引擎
欢迎来到 2019年!在过去的9个月里, 我们一直在为ML.NET添加新的特征和改进相关功能.在提交1.0版本之前,我们将专注于包的整体稳定性并对API进行不断优化, 扩大测试的覆盖面并对开发文档进行 ...
- ASP.NET Web API总结
1. 跨域 提供Http层的web api时,通常需要考虑跨域问题. 因为浏览器处于安全考虑,默认不允许前端页面向不是自己所在的ip/域名发起请求,因此需要服务器端指明自己允许部分或所有域名进行跨域请 ...
- Visual Studio 2008 SP1键盘F10单步调试超慢解决方法
症状: 中断程序调试时,F10或者其它键盘操作都超级慢. 鼠标点击工具栏的按钮速度正常. 解决方法: 网上说的什么删掉所有断点啦,关掉几个窗口啦,重置用户设置啦,关掉某某调试选项啦,关掉防火墙啦,都是 ...
- Django-05模型层之多表操作2
7.3 多表操作 一.创建模型 实例:我们来假定下面这些概念,字段和关系作者模型:一个作者有姓名和年龄.作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之 ...
- LoadRunner12_脚本中运行JavaScript
版权声明:本文为博主原创文章,未经博主允许不得转载. [系统及软件配置] LR版本:12.53 JDK版本:1.8 函数:web_js_run,该函数仅在LR12版本提供支持,LR11不支持JavaS ...
- 利用Python工具进行打包功能
基于Python脚本 iOS 工程的自动打包 导入的库 import os import requests import webbrowser import subprocess import shu ...
- loj #6515. 「雅礼集训 2018 Day10」贪玩蓝月
\(\color{#0066ff}{输入样例}\) 0 11 10 QU 0 0 QU 1 9 IG 14 7 IF 3 5 QU 0 9 IG 1 8 DF QU 0 4 IF 1 2 DG QU ...