【问题标题】:Editing a cell after cloning a row seems to update cells for both rows instead of the one that's changed克隆一行后编辑单元格似乎会更新两行的单元格,而不是更改的单元格
【发布时间】:2021-07-08 01:39:48
【问题描述】:

我正在为 Angular 使用 ag-grid。我有 3 个按钮(添加、克隆和删除)。

  1. 单击一次添加按钮。它增加了一行。
  2. 选择第一行并单击“克隆”按钮。它会克隆该行。
  3. 在新行中,双击并更改任意单元格中的值。单元格编辑完成后,它会用第二行值覆盖第一行。

如何防止这种情况发生?

StackBlitz

这是组件代码:

import { Component, VERSION } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})

export class AppComponent  {
  
  gridApi;
  gridColumnApi;
  rowSelection;

  
  defaultColDef = {
    flex: 1,
    minWidth: 100,
    resizable: true,
    editable: true,
    sortable: true,
    filter: false
  };

  columnDefs = [
    { headerName: 'Make', field: 'make' },
    { headerName: 'Model', field: 'model' },
    { headerName: 'Price', field: 'price'},
    { headerName: 'Miles', field: 'miles' },
    { headerName: 'Age', field: 'age'}
  ];
  
  rowData = [];

  ngOnInit() {
    this.rowSelection = 'multiple';
  }

  onGridReady = (params) => {
    this.gridApi = params.api;
  }

  addRow() {
    this.gridApi.applyTransaction({
      add: [{ "make": 'Toyota', "model": 'Corolla', "price": '$10,000', "miles": '100', "age": '1997' }],
      addIndex:0 
    });
  }

  deleteRow() {
    var selectedData = this.gridApi.getSelectedRows();
    this.gridApi.applyTransaction({remove: selectedData});
  }

  cloneRow() {
    var selectedData = this.gridApi.getSelectedRows();
    this.gridApi.applyTransaction({add: selectedData});
  }

  onCellEditingStopped(event) {
    console.log(this.getAllRows())
  }

  getAllRows() {
    let myData = [];
    for(let i=0;i<this.gridApi.getModel().rowsToDisplay.length;i++) {
      myData.push(this.gridApi.getModel().rowsToDisplay[i].data);
    }
    return myData;
  }

}

【问题讨论】:

    标签: angular ag-grid ag-grid-angular


    【解决方案1】:

    您是否尝试过构建一个新实例并从所选行分配属性,而不是仅将所选行插入回添加中?即使占用了两行,它们也有可能引用相同的记录。

    【讨论】:

    • 我没有尝试过,也不知道该怎么做。不过,您可能对参考资料是正确的。一定是内部的。
    • @Jake 现在最简单的事情你可以做类似 var toAdd = { make: selectedData["make"], model: selectedData["model"], etc... };然后将其传递给 applyTransaction 函数。如果这不起作用,那么我想我的预感是错误的
    • 非常感谢。那行得通。必须使用selectedData 的零索引才能使其工作。 var toAdd = { make: selectedData[0]["make"], model: selectedData[0]["model"], etc... };
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 2018-08-08
    相关资源
    最近更新 更多