Kendo Grid修改后dirty字段始终为false,无法检测未保存变更
解决Kendo Grid修改数据时dirty字段始终为false的问题
嘿,我之前在做Kendo Grid项目时也踩过这个dirty字段的坑,来帮你捋清楚怎么解决~
首先,你遇到的e.model.dirty一直为false的核心原因,大概率是DataSource没有正确配置Model的主键(id),或者缺失schema.model结构,导致Kendo没法正确跟踪数据的变更状态。
问题根源
Kendo DataSource的Model需要通过主键来唯一标识每条记录,只有配置了id,它才能自动维护dirty和dirtyFields属性。如果缺失这个配置,哪怕你修改了数据,Kendo也无法识别这是一条“脏数据”,自然dirty字段一直是false。
另外,你代码里手动修改dirtyFields的操作其实没必要,Kendo内部会自动处理这个属性,手动干预反而可能打乱它的跟踪逻辑。
修复方案
给你的DataSource补上schema.model配置,明确指定主键和字段类型:
var fieldDataSource = new kendo.data.DataSource({ data: gridData, pageSize: 50, // 关键:添加schema配置 schema: { model: { id: "yourPrimaryKeyField", // 替换成你数据里的主键字段名,比如"id" fields: { // 这里定义你的所有字段,示例: username: { type: "string" }, email: { type: "string" }, age: { type: "number" } // 其他字段根据实际数据补充 } } }, change: function (e) { if (e.action === "itemchange") { var changedItem = e.items[0]; // 现在就能正确获取dirty状态了 if (changedItem.dirty) { alert("未保存变更!请确认后再进行其他操作。"); } } } });
额外调试技巧
如果还是有问题,可以在change事件里打印changedItem,验证它是否是Kendo Model实例:
console.log(changedItem instanceof kendo.data.Model);
如果返回false,说明你的gridData里的对象没有被转换成Kendo Model实例,这时候检查schema配置是否正确,或者确保gridData是符合schema字段定义的普通JS对象数组。
内容的提问来源于stack exchange,提问作者Xion




