You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测Angular可编辑表格dataSource的数据变更?

检测表格数据变更的实现思路和代码修改

核心思路

要区分「点击单元格但未修改」和「修改了内容」,关键是保留原始数据的快照,在编辑结束时将当前值与原始值对比。具体分为单个单元格的即时检测、整个数据源的全局检测两种场景。


步骤1:保存原始数据快照

组件初始化时对原始数据源做深拷贝,避免后续修改影响原始值的判断:

// 新增:保存原始数据的深拷贝,避免引用关联
originalDataSource: typeof ELEMENT_DATA = JSON.parse(JSON.stringify(ELEMENT_DATA));
// 原有的可编辑数据源
dataSource = ELEMENT_DATA;

注:如果数据包含嵌套对象、日期等复杂类型,JSON序列化会有局限,可改用lodash.cloneDeep实现深拷贝。


步骤2:单个单元格的变更检测

进入编辑模式时记录当前单元格的原始值,编辑结束(失去焦点)时对比当前值与原始值:

修改TS代码

// 新增:记录当前编辑单元格的原始值
currentOriginalValue: any;

edit(index: number, column: string) {
  this.editableColumn = column;
  this.editableIndex = index;
  // 保存当前单元格的原始值,用于后续对比
  this.currentOriginalValue = this.dataSource[index][column];
}

// 新增:判断单元格是否变更的方法
checkCellChange(index: number, column: string): boolean {
  const currentValue = this.dataSource[index][column];
  return currentValue !== this.currentOriginalValue;
}

// 修改reset方法,加入变更校验逻辑
reset() {
  if (this.editableIndex !== null && this.editableColumn) {
    const hasChanged = this.checkCellChange(this.editableIndex, this.editableColumn);
    if (hasChanged) {
      console.log('单元格内容已修改');
      // 这里可触发业务逻辑,比如标记该行已修改、提交变更等
    } else {
      console.log('未修改任何内容');
    }
  }
  this.editableColumn = '';
  this.editableIndex = null;
}

修改HTML代码(保持blur事件触发逻辑)

<input
  matInput
  placeholder="Placeholder"
  (blur)="reset()"
  appFocusOnLoad
  [(ngModel)]="element.position"
/>

步骤3:整个数据源的全局变更检测

如果需要判断整个表格是否存在任何数据变更,可直接对比原始快照与当前数据源:

// 新增:全局检测数据源是否变更的方法
checkDataSourceChange(): boolean {
  // 遍历所有元素和字段,逐一对比原始值与当前值
  for (let i = 0; i < this.dataSource.length; i++) {
    for (const column of this.options) {
      if (this.dataSource[i][column] !== this.originalDataSource[i][column]) {
        return true;
      }
    }
  }
  return false;
}

// 调用示例:比如在保存按钮点击时校验
saveChanges() {
  const hasGlobalChange = this.checkDataSourceChange();
  if (hasGlobalChange) {
    console.log('数据源存在变更,可提交');
  } else {
    console.log('数据源无变更');
  }
}

额外优化点

  • 支持批量撤销:基于originalDataSource重置当前数据源
resetDataSource() {
  this.dataSource = JSON.parse(JSON.stringify(this.originalDataSource));
}
  • 实时检测:给input添加(input)事件,实时对比当前值与原始值,即时反馈变更状态。

内容的提问来源于stack exchange,提问作者Tim Launders

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:36:23