【问题标题】:How to get a node by index in ag-grid?如何在ag-grid中按索引获取节点?
【发布时间】:2023-03-19 22:32:01
【问题描述】:

AgGrid 期望将节点传递给它的许多数据函数。如何通过索引获取节点?看看下面的片段:

api.forEachNode(function(node){
   api.refreshRows([node]);
})

我可以将node 参数传递给refreshRows() 函数,因为我通过forEachNode() 得到它。

如何在不遍历forEachNode() 的情况下按索引获取节点?

【问题讨论】:

    标签: javascript angularjs ag-grid


    【解决方案1】:

    这个问题可能有点晚了,但无论如何对于将来正在搜索这个问题的人来说:

    除了给出的答案,还可以通过以下方式获取行节点,

    // Getting the row node by the row index
    cont rowNode1 = api.getDisplayedRowAtIndex(rowIndex);
    

    在某些情况下,上述方法不适合,因为当您对网格进行一些更改(排序、过滤等)时,rowIndex 可能会发生变化。
    另一种方法是使用即使您对网格进行排序,过滤...也不会改变的行的ID。

    getRowNode(id) :返回具有给定 ID 的行节点。行节点 id 是您通过回调 getRowNodeId(data) 提供的,否则 id 是设置行数据时网格自动生成的数字。

    // Getting rowNode by row id
    const rowNode2 = api.getRowNode(rowId);
    

    【讨论】:

    • 感谢您建议idx 在用户更改显示顺序的情况下将不准确。请继续并将其添加到我的答案中。
    【解决方案2】:

    您可以使用getVirtualRow() 方法获取单行。此函数是行模型的一部分。可以通过getModel()函数获取Row Model。

    var model = api.getModel();
    console.log(model.getVirtualRow(idx));
    

    【讨论】:

    • 如果你这样做,一定要禁用排序/过滤,否则你会遇到一些问题。
    • Row Modal 有不同的数据集。它有原始行、过滤后的行和排序后的行。 Ag-grid 在排序或过滤后从不修改原始行数据。无需禁用任何内容,也不会出现任何问题。
    • 我忘了那部分。我主要使用服务器端加载/过滤,所以它不一样。
    【解决方案3】:

    基于@Charlie H 的回答,自他使用的版本以来,API 完全有可能发生了一些变化。我正在使用(截至 2017 年 12 月的当前版本)15.0 版。我发现rowsToDisplay[] 包含一个可访问的行数组。例如,以下内容完全符合您的预期:

    onCellEditingStarted: function (event) {
        var displayModel = gridOptions.api.getModel();
        var rowNode = displayModel.rowsToDisplay[event.rowIndex];
        rowNode.setRowHeight(100);
        gridOptions.api.onRowHeightChanged();
    },
    

    【讨论】:

      【解决方案4】:

      如果您想逐行遍历网格以便可以使用它(其中 $scope.grid 是您的网格名称):

              $scope.high_index = 0;
              $scope.rows = [];
      
              $scope.grid.api.forEachNode(function (node) {
      
                  $scope.rows[node.childIndex] = node.id;
      
                  if (node.childIndex > $scope.high_index)
                      $scope.high_index = node.childIndex;
              });
      
              for (i = 0; i <= $scope.high_index; i++) {
      
                  var node = $scope.grid.api.getRowNode($scope.rows[i]);
              }
      

      或者,如果您想要一个按子索引的行节点,您现在可以使用(在上面设置 $scope.rows 之后):

             var node = $scope.grid.api.getRowNode($scope.rows[i]);
      

      i 是你想要的行号。

      【讨论】:

        【解决方案5】:

        你不能。

        这是因为网格旨在过滤/排序数据。因此,按索引工作并不意味着什么,并且本机不支持。

        为什么需要刷新第 n 行?如果是因为用户操作,您可以捕获事件,获取节点并调用刷新。 (活动文档链接:http://ag-grid.com/javascript-grid-events/index.php

        如果您没有太多数据(行/列),您可以调用全局刷新。

        【讨论】:

        • 直接更改基础数据后如何刷新单个原始数据?这不会触发任何事件。
        猜你喜欢
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 2018-10-13
        • 2019-07-12
        • 2020-03-06
        • 2017-09-18
        • 2019-02-28
        • 1970-01-01
        相关资源
        最近更新 更多