一些背景:
让我解释一下我们是如何在这里使用网格的,看看这是否能帮助我们找到一个答案。
我们的应用程序使用Chrome或Edge的本地存储。这使得我们可以很容易地获得大量的数据,但也带来了相当大的挑战。
例如,如果用户更新其网格中字段的值,则需要更新:
这种同步会发生,最后我们将看到下面的代码。
此外,我们允许用户在整个系统的多个地方更新数据,例如使用下面的图片:

用户可以自己更新行(北、南、东和西区域),也可以单击南12塔或组织阿尔法( Organization ),并以模式更新这些名称或其他信息。
注:在这个网格中,12塔南和组织阿尔法确实是行分组。它们也是单独的数据位,可以在应用程序的其他地方进行操作。本质上,它们是与这里的行数据相关的数据。
当有人点击"Organization“并更新其名称时,下面的代码就会触发。
,我们试图解决的主要问题是,在有人更新组织阿尔法或12号塔南的名称后,网格重新组合并重新绘制正确。我们需要使网格更新被更新的行分组下的子元素,这样行分组可以重新绘制,并且可以相应地显示正确的名称。
在推荐之前:只需刷新clientsiderowmodel就不行了。它使用旧的网格数据进行刷新。我们必须先应用更新,然后再进行任何更新。
更新:
我尝试使用这两种方法来应用事务、使用节点I和使用RowNode对象。这两种方法都会产生相同的结果,即使调试器显示我正在合法地传递好的对象或ids。
原始员额:
我很难理解为什么在我们的应用程序ag网格的这个特定实例中不希望允许行事务在行节点数组上进行,但是允许我在上调用相同的行节点数组上的方法。
我得到的错误(我试图更新的每个节点)如下所示:
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方法,这就是为什么我只需要更新子方法的原因。有人知道为什么这不管用吗?
//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。
发布于 2022-03-31 14:25:21
我最后发现的是:
根据银格网,文献有两种类型.直接节点ID引用和节点数据对象引用。
无论出于什么原因,方法都无法工作。所以在我上面的问题中,我转向了对象更新的方法。
然而,网格似乎需要一个新的对象来正确地知道我们试图引用哪些行。
最终为我工作的是从本地存储(indexedDB)获得一个新的数据集。我仍然不知道为什么使用res.allLeafChildren不起作用,即使它是相同的数据集。
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协调的数据通信的不同网格函数中。
发布于 2022-05-24 07:44:23
在AG Grid中,refreshCells()和applyTransaction()的参数是不同的。在refreshCells中,我们提供了一个RowNode对象数组。在applyTransaction中,我们提供了一个行数据对象数组。
在代码片段中,res.allLeafChildren返回一个RowNode对象数组,这就是self.gridOptions.api.refreshCells()工作的原因。但是要使self.gridOptions.api.applyTransaction()工作,您需要如下所示
self.gridOptions.api.applyTransaction({ update: res.allLeafChildren.map(node => node.data) });https://stackoverflow.com/questions/66535846
复制相似问题