首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AG-Grid: refreshCells() & applyTransaction()。同样的rowNodes阵列。一个管用,另一个不行?

AG-Grid: refreshCells() & applyTransaction()。同样的rowNodes阵列。一个管用,另一个不行?
EN

Stack Overflow用户
提问于 2021-03-08 19:19:52
回答 2查看 2.1K关注 0票数 0

一些背景:

让我解释一下我们是如何在这里使用网格的,看看这是否能帮助我们找到一个答案。

我们的应用程序使用Chrome或Edge的本地存储。这使得我们可以很容易地获得大量的数据,但也带来了相当大的挑战。

例如,如果用户更新其网格中字段的值,则需要更新:

  1. 用户的本地存储
  2. 服务器
  3. 将更新推到用户组织中的每个其他用户

这种同步会发生,最后我们将看到下面的代码。

此外,我们允许用户在整个系统的多个地方更新数据,例如使用下面的图片:

用户可以自己更新行(北、南、东和西区域),也可以单击南12塔或组织阿尔法( Organization ),并以模式更新这些名称或其他信息。

注:在这个网格中,12塔南和组织阿尔法确实是行分组。它们也是单独的数据位,可以在应用程序的其他地方进行操作。本质上,它们是与这里的行数据相关的数据。

当有人点击"Organization“并更新其名称时,下面的代码就会触发。

,我们试图解决的主要问题是,在有人更新组织阿尔法或12号塔南的名称后,网格重新组合并重新绘制正确。我们需要使网格更新被更新的行分组下的子元素,这样行分组可以重新绘制,并且可以相应地显示正确的名称。

在推荐之前:只需刷新clientsiderowmodel就不行了。它使用旧的网格数据进行刷新。我们必须先应用更新,然后再进行任何更新。

更新:

我尝试使用这两种方法来应用事务、使用节点I和使用RowNode对象。这两种方法都会产生相同的结果,即使调试器显示我正在合法地传递好的对象或ids。

原始员额:

我很难理解为什么在我们的应用程序ag网格的这个特定实例中不希望允许行事务在行节点数组上进行,但是允许我在上调用相同的行节点数组上的方法。

我得到的错误(我试图更新的每个节点)如下所示:

代码语言:javascript
复制
clientSideNodeManager.js:181 ag-Grid: could not find row id=undefined, data item was not found for this id

最初,我从表面上理解了这个错误,并认为我的代码的其余部分可能是无序执行的,而我作为参数传递的节点可能确实是未定义的。我更进一步,简单地在setTimeout中设置对setTimeout()的调用,以重复检查事情是否有相应的行为。那里没有运气。我启动了一个调试器,并使用控制台来确保所有的东西都是按要求的顺序启动的。到目前为止一切似乎都很好。

下面是我关注的代码。本质上,我从一个不同的函数中得到一个rowNode,并且需要更新该行节点下的所有叶子节点。很简单。

我的问题是,为什么refreshCells方法可以工作,但是applyTransaction方法不能处理传递给它的完全相同的rowNodes?我知道您不能将行组传递给applyTransaction方法,这就是为什么我只需要更新子方法的原因。有人知道为什么这不管用吗?

代码语言:javascript
复制
//self=this by the way. Set earlier in function.

this.traverseTree(doc).then((res)=>{

  console.log(res); //Shows the correct row group
  console.log(res.allLeafChildren); //Shows all leaf children
              
  setTimeout(() => {
    if(res.allLeafChildren.length > 0) {

      //Below function fires. Cells actually refresh
      self.gridOptions.api.refreshCells({rowNodes: res.allLeafChildren, force: true});

      //Will not apply transaction on same rowNodes. returns error above for each node
      self.gridOptions.api.applyTransaction({update: res.allLeafChildren});
    }
  },10);
});

我们使用的是角10和Ag版本24.0.0。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-31 14:25:21

我最后发现的是:

根据银格网,文献有两种类型.直接节点ID引用和节点数据对象引用。

无论出于什么原因,方法都无法工作。所以在我上面的问题中,我转向了对象更新的方法。

然而,网格似乎需要一个新的对象来正确地知道我们试图引用哪些行。

最终为我工作的是从本地存储(indexedDB)获得一个新的数据集。我仍然不知道为什么使用res.allLeafChildren不起作用,即使它是相同的数据集。

代码语言:javascript
复制
this.traverseTree(doc).then((res) => {
  // debugger;
  let trans = [];
  let childDocType = res.allLeafChildren[0].data.docType;
  let projectID = res.allLeafChildren[0].data.exopp_equiprojects_id_c;

  let optionFilter = {
    filters: {
      exopp_equiprojects_id_c: {
        value: projectID,
        operator: '=',
        type: 'string'
      }
    }
  };

  let tempArr = [];
  let delArr = [];

  if(projectID === self.projectContextId){ 
    //Here is where I'm getting the new dataset. Which returns the EXACT same data as res.allLeafChildren....
    this.utils.getLocalDoc(childDocType, optionFilter).pipe(take(1)).toPromise().then((res) => {
      Object.keys(res.docs).forEach(doc => {
        tempArr.push(res.docs[doc]);
      });
      Object.keys(tempArr).forEach(doc => {
        //If doc is deleted
        if(tempArr[doc].deleted === 1 || tempArr[doc].deleted === '1') {
          delArr.push(tempArr[doc]);
        } else {
          trans.push(tempArr[doc]);
        }
      });

      if(delArr.length > 0) self.gridOptions.api.applyTransactionAsync({remove: delArr});
      // debugger;
      self.gridOptions.api.applyTransactionAsync({update: trans});
      self.gridOptions.api.refreshCells({rowNodes: trans, force: true});
    });
  }
});

既然它在我身上出现了,我可以做的另一件事就是看看是否使用像JSON.parse(JSON.stringify(res.allLeafChildren))这样的东西,以及看它是否也解决了这个问题/避免了我不得不查询indexedDb。

不管怎样,只要注意这个问题就行了。这个问题和答案位于一个与GraphQL协调的数据通信的不同网格函数中。

票数 0
EN

Stack Overflow用户

发布于 2022-05-24 07:44:23

在AG Grid中,refreshCells()applyTransaction()的参数是不同的。在refreshCells中,我们提供了一个RowNode对象数组。在applyTransaction中,我们提供了一个行数据对象数组。

在代码片段中,res.allLeafChildren返回一个RowNode对象数组,这就是self.gridOptions.api.refreshCells()工作的原因。但是要使self.gridOptions.api.applyTransaction()工作,您需要如下所示

代码语言:javascript
复制
self.gridOptions.api.applyTransaction({ update: res.allLeafChildren.map(node => node.data) });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66535846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档