【问题标题】:How to Get Updated Rows in Ag-grid如何在 Ag-grid 中获取更新的行
【发布时间】:2018-05-10 09:47:59
【问题描述】:

单击“插入新行”按钮后,将触发以下方法,并将一个空的新行附加到当前最后一行。

insertNewRow(){

    var newItem = this.createNewRowData();
    var res = this.gridOptions.api.updateRowData({add: [newItem]});

  }

createNewRowData(){
    var newData = [];
    //blah blah
    return newData;
  }

在我丰富了屏幕上的数据后,如何让网格获取新行(可能还有自上次数据库检索以来已更改的所有行)?

请注意,在我点击保存按钮之前,我可以多次点击“插入新行”来创建多行。

saveChanges(){
    var data = "HOW TO GET NEW ROWS AND UPDATED ROWS, AND STORE HERE??";
    this.myAppService.saveData(data).subscribe(
    //blah blah
    );
    console.log("Saved successfully to database");
  }

编辑 1

尝试将以前的记录存储到变量(“tableData”)中:

tableData: string[] = [];
currentData: string[] = [];

retrieveTableData (){
    //blah blah
    tableData loaded with an array of json
}

saveChanges(){
    this.gridOptions.api.forEachNode((rowNode) => {
      this.currentData.push(rowNode.data);
    });
    console.log(this.currentData);
    this.currentData.forEach(item => {
      console.log(item);
      if (!this.tableData.includes(item)){
      console.log("Updated Row: " + item);
      }
    });
  }

我猜数据类型等存在一些问题。

控制台记录“tableData”和“currentData”的示例:

[object Object],[object Object],[object Object]

如果我打印出任一变量下的每个项目:

{FUND_CODE: "TEST1", PORT_CODE: "TEST1"}

【问题讨论】:

  • 查看答案,如果您需要帮助,请告诉我

标签: angular typescript ag-grid


【解决方案1】:

另一种方法是在您的对象中保留标志以识别其新的/修改的,

interface Item {
 //other properties
 newOrModified?: string;
}
_______________

items:Item[];
insertNewRow(){
    var newItem = this.createNewRowData();
    newItem.newOrModified="New";
    var res = this.gridOptions.api.updateRowData({add: [newItem]});
  }

onCellValueChanged(item: Item ) {
 item.newOrModified="Modified";
}

saveChanges(){
 cost modifieditems = this.items.filter(item=> item.newOrModified === "Modified" );
  cost newitems= this.items.filter(item=> item.newOrModified === "New" );
}

<ag-grid-angular style="width: 100%; height: 500px;"
         class="ag-fresh"
         [columnDefs]="columnDefs"
         [rowData]="items"
         (gridReady)="onGridReady($event)"
         (cellValueChanged)="onCellValueChanged($event)">
</ag-grid-angular>

你可以这样做,

//store your old records in one variable 
this.previousrecords = this.http.getAllRecords();
this.bindRecrods = [...this.previousrecords];//bind this to grid

//when saving records try like this 
this.bindRecrods.forEach(rec=> {
 if( !this.previousrecords.includes(rec) ){
   //insert or update record
 }
});

【讨论】:

  • 任何一个都是非常“javascript”的方式......实际上我正在寻找任何可以处理这个问题的 Ag-Grid 中的内置函数/API。让我试试你的建议。会回来的。
  • @Henrix - 我试图研究 api 但无法找到可以直接返回您的方法,我认为您应该将邮件发送给他们可以提供帮助的 ag-grid 团队,因为它是付费的跨度>
  • 嘿,我正在试验您将旧记录存储在一个变量中的建议。不知何故 this.previousrecords.includes 总是返回 FALSE。有关详细信息,请参阅我的原始帖子。
  • @Henrix - 如果包含不起作用,那么建议您使用filter 并执行比较逻辑......但这是我建议使用其他方式添加标志的艰难方式监控对象newOrModified
【解决方案2】:

回答这个问题有点晚了,但最近我遇到了同样的问题并想出了一种方法来帮助我克服这个问题,所以想分享一下。

set: Set<string> = new Set<string>();

onCellValueChanged(params: any) {
  this.set.add(params.node.id);
}

onSubmit() {
  this.set.forEach( id => console.log(JSON.stringify(this.grid.api.getRowNode(id).data)));
  // call the api to update data
  // clear the set post update call
  this.set.clear();
}

在事件 cellValueChanged 上调用方法 onCellValueChanged。在方法内部,将正在编辑的行的行 ID 添加到集合中。提交数据时,遍历编辑的行 ID 集并使用网格 api 获取行。

【讨论】:

    【解决方案3】:

    查看https://www.ag-grid.com/javascript-grid-accessing-data/#for-each-node

    有时您可能希望遍历 网格。这可以使用网格的迭代 API 来完成。迭代 API 会遍历每个 rowNode,无论 rowNode 是否是 显示与否。例如,如果分组并且该组已关闭,则 网格不显示组的孩子,但是孩子 包含在迭代“for-each”方法中。

    // iterate through every node in the grid
    api.forEachNode( function(rowNode, index) {
        console.log('node ' + rowNode.data.athlete + ' is in the grid');
    });
    
    // if the order of the iteration is important
    api.forEachNodeAfterFilterAndSort( function(rowNode, index) {
        console.log('node ' + rowNode.data.athlete + ' passes the filter and is in this order');
    });
    

    选择你需要的函数,然后将每一行的内容推送到数组中:

    data = [];
    api.forEachNode( function(rowNode, index) {
        data.push(rowNode.data);
    });
    

    EDIT 用于检查要保存/未保存的行,您可以设置和获取它们的属性:https://www.ag-grid.com/javascript-grid-row-styles/

    在创建和更改某一行的单元格时将 unsaved 设置为 true。

    rowNode.setDataValue("unsaved", true);
    

    然后进入gridOptions,这样您就可以为所有已编辑/插入的行设置“未保存”样式:

    gridOptions.getRowStyle = function(params) {
        if (params.node.node.getData().unsaved) {
            return { background: 'red' }
        }
    }
    

    如果这不起作用,请告诉我,我半年没有使用 agggrid。

    【讨论】:

    • 谢谢菲尔。我认为我最初问题中的困难部分是如何识别自上次数据库检索以来更改/新插入的行。
    • 在ag-gid官方文档中,'sickDays'是一个已有的列,rowNode.setDataValue用来给一个列设置值。我还没有找到一个“内置”属性来识别更改/新插入的行,而没有明确声明列或字段用于识别目的。
    • 那么分配一个您不为其创建列的属性有什么问题?如果我没记错的话,我们也这样做了。您的应用程序中有一组已定义的列,并且您有一组属性。并且根据网格(我们在应用中有多个网格),我们配置应该显示哪些列。
    猜你喜欢
    • 2017-09-18
    • 2018-11-14
    • 2020-12-16
    • 2017-09-18
    • 1970-01-01
    • 2020-06-03
    • 2019-07-12
    • 2019-02-28
    • 2018-12-27
    相关资源
    最近更新 更多