ExtJS 3.4调用markDirty后getModifiedRecords返回空数组问题排查
getModifiedRecords()返回空数组的问题 我之前也碰到过一模一样的情况,在ExtJS 3.x里手动调用markDirty()并直接修改modified对象,确实不会被store的getModifiedRecords()方法识别到——这是因为ExtJS 3.4的store内部维护了一套自己的修改记录跟踪机制,单纯手动标记记录为dirty或者修改modified属性,并不会触发store更新它的内部修改列表。
原因分析
ExtJS 3.x的getModifiedRecords()方法依赖于store在记录被修改时(通过set()、beginEdit()/endEdit()等官方API)触发的update事件来维护内部的修改记录集合。手动设置dirty:true和modified对象绕过了这个流程,所以store完全不知道这条记录已经被修改了。
解决方案
1. 优先使用官方API修改记录(推荐)
不要手动修改dirty和modified,而是用record.set()方法来更新字段,这样store会自动跟踪修改并将记录加入到修改列表中:
var record = dtl.store.getAt(i); // 用set方法批量修改字段 record.set({ idStyle: "TEST-4", idStyleDtl: 2052, color: 6, colorNm: "BLACK", s1: 0 });
执行这段代码后,你再调用dtl.store.getModifiedRecords()就能看到这条记录了,同时record的dirty属性会自动被设为true,modified对象也会正确生成。
2. 手动触发store的更新事件(特殊场景用)
如果因为某些业务原因必须手动标记记录为dirty,那你需要手动触发store的update事件,让store知道这条记录已经被修改:
var record = dtl.store.getAt(i); record.markDirty(); // 手动设置modified对象(如果需要) record.modified = { idStyle: "TEST-4", idStyleDtl: 2052, color: 6, colorNm: "BLACK", s1: 0 }; // 触发update事件,告知store记录已编辑 dtl.store.fireEvent('update', dtl.store, record, Ext.data.Record.EDIT);
触发这个事件后,store会把这条记录加入到内部的修改集合中,此时调用getModifiedRecords()就能获取到它。
3. 检查store的pruneModifiedRecords配置
另外可以确认一下你的store是否设置了pruneModifiedRecords: true——这个配置会在store同步后清空修改记录集合,如果是这个原因导致的,你可以把它设为false(默认就是false):
// 初始化store时的配置示例 var store = new Ext.data.Store({ // ...其他配置项 pruneModifiedRecords: false });
内容的提问来源于stack exchange,提问作者Min Lee

