返回

GoJS图表更新延迟:事务提交难题破解指南

vue.js

GoJS 图表事务提交后不更新:问题与解决方案

问题

在使用 GoJS 图表时,你是否遇到过这样的问题:当你执行搜索操作并希望高亮显示特定节点时,图表却迟迟不更新,无法移动到正确的元素位置?

事务机制

GoJS 使用事务机制管理对模型的更改。当启动一个事务时,模型处于中间状态,直到事务提交。在此期间,图表不会反映模型的更改。

异步更新

在典型的搜索功能实现中,你通常会使用 startTransaction 开始一个事务,将 IsHighlighted 属性设置为 true,然后启动另一个事务将其他节点的 IsHighlighted 属性设置为 false。这些事务都是异步的,会在稍后的时间提交。

因此,在你调用移动元素之前,图表不会更新以反映模型的更改,因为事务尚未提交。

解决方案

要解决这个问题,可以使用 commitTransaction 方法显式提交事务。这将强制图表立即更新以反映模型的更改。

修改后的搜索功能实现如下:

findNodeByName(name) {
  let foundNode = false;

  this.myDiagram.nodes.each((node) => {
    if (name && node.data.Name.toLowerCase().includes(name.toLowerCase())) {
      // Only call the model's set method if the value is changing
      if (!node.data.IsHighlighted) {
        node.diagram.startTransaction('selected');
        node.diagram.model.setDataProperty(node.data, "IsHighlighted", true);
        node.diagram.commitTransaction('selected'); // Commit the transaction immediately
      }
      foundNode = true; // Node found, no need to set to false for other nodes
    } else {
      // Only call the model's set method if the value is changing
      if (node.data.IsHighlighted) {
        node.diagram.startTransaction('selected');
        node.diagram.model.setDataProperty(node.data, "IsHighlighted", false);
        node.diagram.commitTransaction('selected'); // Commit the transaction immediately
      }
    }
  });

  return foundNode;
}

通过立即提交事务,图表将在模型更改后立即更新。

常见问题解答

Q1:为什么图表不会在事务启动后立即更新?
A1:GoJS 使用事务机制来管理更改,在事务提交之前,不会反映模型更改。

Q2:如何强制图表立即更新?
A2:使用 commitTransaction 方法显式提交事务。

Q3:何时应该使用事务?
A3:当需要批量更改模型时,使用事务可以提高性能。

Q4:是否有其他方式来解决不更新的问题?
A4:另一种方法是使用数据绑定,它会在模型更新时自动更新图表。

Q5:如果我使用数据绑定,我还需要显式提交事务吗?
A5:当使用数据绑定时,不需要显式提交事务,因为更改会自动提交。

结论

通过理解 GoJS 的事务机制并使用 commitTransaction 方法显式提交事务,你可以确保在需要时立即更新图表。这将提高你的应用程序的响应能力和用户体验。