You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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,它才能自动维护dirtydirtyFields属性。如果缺失这个配置,哪怕你修改了数据,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

火山引擎 最新活动