在使用ExtJS的grid控件时,常用到store 数据绑定。然后grid又是可以编辑的,如下:
想要是实现的场景:在整个表格编辑后,点击取消或关闭时,判断数据有无被更改过
对grid的更改,其实就是对store的更改,那我们只需查找store里的数据有无更改记录即可。
store里的数据,都是一个个数据集合collection,而collection有两个标记 可以判断此条数据是否变更过。
dirty
此配置属性描述此组件的已修改状态。只读
Defaults to:
false
若是组件或是数据对象被修改过 dirty就为true
cruState
该值最初为“R”或“C”,表示初始CRUD状态。当记录发生更改并通知各个加入方(stores, sessions, etc.)时,此值将在这些调用之前更新。换言之,在更新“crudstate”之后通知加入方。这意味着,如果在这些通知之外使用此状态,则“crudState”属性可能与基础更改短暂不同步。
- "R" - 记录处于完全检索(未修改)状态。
- "C" - 记录处于新创建(虚拟)状态。
- "U" - 记录处于更新、修改(脏)状态。
- "D" - 这项记录处于“删除”状态
Defaults to:
'R'
使用方法,用数据对象collection的集合items去遍历,然后查找行的dirty
Store对象.getData().items.some(
(x)=>{
if(x.dirty) {
alert('有更改记录');
return true;//使用return true中断
}
})
若是想实时监听store里的行数据有无变动,可以通过监听itemchange事件来实现
Store对象.getData().addListeners('itemchange', '方法名', 作用域)
例如:
onItemChange(collection, details) {
const me = this,
grid = me.lookup('grid'),
store = grid.getStore(),
vm = me.getViewModel();//用viewModel里某个字段标识
let ModifiedRecords = store.getModifiedRecords();//所有有变动的列
if (ModifiedRecords.length == 0) vm.set('hasChange', false);
else {
let isChange = false;
ModifiedRecords.map((rec) => {
//rec.modified 变更的数据 未提交改变前的值
for (var key in rec.modified) {
if (rec.modified[key] == null) {
if (Ext.isEmpty(rec.get(key)))//若为true 相当于没更改
{
isChange = false;
} else return isChange = true;
} else {
if (rec.modified[key] != rec.get(key))//新值和旧值不等
return isChange = true;
}
}
});
vm.set('hasChange', isChange);
}
},