拔一拔 ExtJS 3.4 里你遇到的没遇到的 BUG(1)
本文从今天开始,我要做的就是不断的更新,不断的披露ExtJS 3.4的BUG并修复它。需要注意的是版本为3.4而不是4.0,因为4.0改动和变化比较大,所以不要对号入座。
嘿嘿,本人不怎么写东西,不过因为这些BUG困扰了我很久,所以很蛋疼,拔一拔以泄心头之恨。
本文指出的Bug修复方式不会修改原有代码,只需要外部引入一个文件即可。
不管你是否正在用该框架,或者曾经使用该框架,请注意您的ExtJS 的版本为3.4。
另外,我不保证每天更新,所以写不写文章取决于我工作中遇到了BUG。好了开拔。
观看本文需要有点Javascript基础,这个需要注意。
BUG 来源 Ext.data.DataStore
BUG 描述,引起经过使用JsonWriter进行数据自动存储。
触发BUG配置:
Ext.data.JsonWriter -> listfu : true
Ext.data.DataStore -> autoSave : true
Ext.data.DataStore -> writer 设置为listfu的JsonWriter
满足以上条件即可触发这个BUG
触发环境:
通过 Ext.data.Store的remove方法删除两条及以上数据时。
红色为引起BUG源码部分:
Ext.data.Store
remove : function(record){
if(Ext.isArray(record)){
Ext.each(record, function(r){
this.remove(r);
}, this);
return;
}
var index = this.data.indexOf(record);
if(index > -1){
record.join(null);
this.data.removeAt(index);
}
if(this.pruneModifiedRecords){
this.modified.remove(record);
}
if(this.snapshot){
this.snapshot.remove(record);
}
if(index > -1){
this.fireEvent('remove', this, record, index);
}
},
清单一
相关代码:
if (this.writer) {
this.on({
scope: this,
add: this.createRecords,
remove: this.destroyRecord,
update: this.updateRecord,
clear: this.onClear
});
}
清单二
destroyRecord : function(store, record, index) {
if (this.modified.indexOf(record) != -1) {
this.modified.remove(record);
}
if (!record.phantom) {
this.removed.push(record);
record.lastIndex = index;
if (this.autoSave === true) {
this.save();
}
}
},
清单三
好了,我简单说明一下这个BUG,因为 Store 自行添加了事件remove,所以在remove一个record(Ext.data.Record)时,会触发一个remove事件。
如清单一种的红色代码部分,这个事件被调用了。这个方法被传递到destroyRecord方法上,这时候注意代码中的this.autoSave片段。
因为开启了listful和autoSave,所以就会使用一个ajax调用。
但是因为我们删除的数据是多个,所以这个调用会被多次执行。
删除一条就执行一次,删除两条就执行两次,删除三条就执行三次。
以下是修复这个BUG的外部代码,请在ext-all.js或ext-all-debug.js后引入这段代码,你可以创建一个新的文件用于引用。
Ext.apply( Ext.data.Store.prototype, {
_bug0_remove : function( record ) {
var index = this.data.indexOf(record);
if(index > -1){
record.join(null);
this.data.removeAt(index);
}
if(this.pruneModifiedRecords){
this.modified.remove(record);
}
if(this.snapshot){
this.snapshot.remove(record);
}
if(index > -1) {
this.fireEvent('remove', this, record, index);
}
},
// 覆盖已有的方法。
remove : function(record) {
if(Ext.isArray(record)) {
Ext.each(record, function(r){
this._bug0_remove(r);
}, this);
} else {
this._bug0_remove(record);
}
if (this.autoSave === true) {
this.save();
}
},
// 覆盖已有的方法。让方法支持多个record。
destroyRecord : function(store, record, index) {
if (this.modified.indexOf(record) != -1) {
this.modified.remove(record);
}
if (!record.phantom) {
this.removed.push(record);
record.lastIndex = index;
// 除去该方法,修改调用逻辑
//if (this.autoSave === true) {
// this.save();
//}
}
},
})
拔一拔 ExtJS 3.4 里你遇到的没遇到的 BUG(1)的更多相关文章
- Extjs grid column里添加button等html标签,并增加点击事件
Extjs里有个actioncolumn,但actioncolumn只能添加一系列button,不能既有字又有button 如何能在column里增加html标签,并给button添加事件呢? 1. ...
- 火狐下<a>标签里嵌套的<select>不能选的bug
今天遇到了这个问题,网上一找就找到原因了:在狐火下<a>标签里嵌套的<select>不能选 可是我查找这个问题过程中依然饶了一些时间,原因是在<a>标签没有写hre ...
- 记录微信浏览器里word链接点击没反应的bug
有用户反应点击下载附件时没有反应,让用户把该下载链接复制到微信对话框中,发现点击该链接仍然无反应,但是在内置的手机浏览器中打开是正常的而且可以下载. 链接地址,有需要的可以拿去进行测试: http:/ ...
- Axiom3D:Ogre地形组件代码解析
大致流程. 这里简单介绍下,Axiom中采用的Ogre的地形组件的一些概念与如何生成地形. 先说下大致流程,然后大家再往下看.(只说如何生成地形与LOD,除高度纹理图外别的纹理暂时不管.) 1.生成T ...
- oracle12c新特点之可插拔数据库(Pluggable Database,PDB)
1. 12c PDB新特点的优势 1) 可以把多个PDB集成进一个平台. 2) 可以快速提供一个新的PDB或一个已有PDB的克隆. 3) 通过拔插技术,可以快速把存在的数据库重 ...
- ExtJs选择器
想要利用ExtJS的库函数对DOM进行各类操作,就要得到Element类型的对象,但是Ext.get()取到的虽然是Element,但是参数只能是id,如果大家对jQuery的selector方式很喜 ...
- extjs几个奇怪的错误
在用Extjs进行网页开发的时候,遇见了一下两个错误,这两个错误的位置用firebug调试显示在extjs-all.js Ext.resetElement is undefined g.el is n ...
- Extjs checkbox数值回显
昨天上午花了半天时间都在调 extjs的编辑页面里的CheckBox的回显问题,一直没搞定,毕竟我接触extjs才一个月不到,属于小白.先上个图: 这就是编辑页面的时候,需要的效果.然后我代码里是用了 ...
- Practical Malware Analysis里有关inetsim\APATEDNS
以前从未接触过linux,碰到了许多问题,按步骤: 1\安装VMWARE,安装ubuntu16.04 问题1:之前装的是VM10,装完后没有安装VMTOOLS,我点安装 VMTOOLS,它弹出“简易安 ...
随机推荐
- Android读写JSON格式的数据之JsonWriter和JsonReader
近期的好几个月都没有搞Android编程了,逐渐的都忘却了一些东西.近期打算找一份Android的工作,要继续拾起曾经的东西.公司月初搬家之后就一直没有网络,直到今日公司才有网络接入,各部门才開始办公 ...
- javaScript 工作必知(十) call apply bind
call 每个func 都会继承call apply等方法. function print(mesage) { console.log(mesage); return mesage; } print ...
- 20151214--JSTL
- su 切换用户
大部分Linux发行版的默认账户是普通账户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户,Linux中切换用户的命令是su或su - 前者只是切换ro ...
- jquery写的tab切换效果 非常简单
自己写的一款 tab切换效果,比较简单,适合新手 <style type="text/css">*{margin:0; padding:0; font-size:12p ...
- attempting to bokeyaunrun eclipse useing the jre instead of jdk,to run eclipse using
关于eclipse运行出现,attempting to bokeyaunrun eclipse useing the jre instead of jdk,to run eclipse using错误 ...
- [LeetCode]题解(python):146-LRU Cache
题目来源: https://leetcode.com/problems/lru-cache/ 实现一个LRU缓存.直接上代码. 代码(python): class LRUCache(object): ...
- opengl笔记
GL_ARRAY_BUFFER(表示顶点数据) GL_ELEMENT_ARRAY_BUFFER(表示索引数据) GL_PIXEL_UNPACK_BUFEER( 表示传递给O p e n G L 的像素 ...
- LINUX查看硬件配置命令
LINUX查看硬件配置命令 系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinf ...
- poj2509---抽k根烟就换一支,求能抽烟的总数
#include <stdio.h> #include <stdlib.h> int main() { int now,k; while(scanf("%d %d&q ...