当第三方widget改变自己的反应式数据源时,Meteor避免双重刷新。

问题描述 投票:7回答:1

我有一个jsTree,我正试图双向 "连接 "到Meteor集合。现在我自动触发一个 jsTree.refresh() 每当集合更新的帮助下 .observeChanges:

FileTree.find().observeChanges({
  added: function() {
    $.jstree.reference('#fileTree').refresh();
  },
  changed: function() {
    $.jstree.reference('#fileTree').refresh();
  },
  removed: function() {
    $.jstree.reference('#fileTree').refresh();
  }
});

我想允许在jsTree中通过拖动东西来编辑数据库。 下面是它的样子。

  1. 用户将元素拖到新的位置
  2. jsTree更新元素在树中的位置。
  3. jsTree调用事件处理程序
  4. 事件处理程序更新数据库

如果我的理解正确的话,我的问题是,数据库更新会触发 observeChanges 事件,我之前设置的。 这将导致树的又一次刷新。 这将导致恼人的闪烁,从而打断用户。 (即在每次拖拽操作后,文件浏览器将在大约 0.75 秒内无法使用。)

我如何防止这种不必要的更新,或者有没有更好的方法来结构我的jsTree界面,以防止这个问题。

javascript meteor dom-events jstree
1个回答
2
投票

你看过这个吗?

看来他是在用 autorun 与。observeChanges 但主要是和你的概念一样。

Template.showtree.rendered  = function(){

  var self  = this;
  var nodes = [];

  Nodes1  = $('#tree1').tree();
  Nodes2  = $('#tree2').tree();

  if (!self.handle){
    self.handle = Meteor.autorun(function(){
      // refresh trees on new data
      nodes = Nodes.find();
      Nodes1.tree('option', 'data', 'Projects');
      Nodes2.tree('option', 'data', 'Contexts');
    }); //self.handle
  } // if (!self.handle)
}

如果这个东西只有一个用户会被编辑(一次),那么也许你只需要 不刷新 而把树作为作者的接口。

如果它需要根据数据库更新(来自其他用户,或者只是为了保持同步)来刷新,你可以考虑改变你的工作流逻辑。

  1. changed.jstree 事件,在本地更新数据库,阻止
  2. autorun 触发jstree中的刷新

理论上来说,应该只需要1次刷新,而不是2次或3次。

或者如果你真的想限制重抽... 你可以找到 旧父节点新的父节点 只有我们 refresh_node(obj) 来刷新这些变化节点。

refresh_node (obj)

刷新树中的一个节点(重载它的子节点),该节点内所有打开的节点都会通过调用load_node来重载。

© www.soinside.com 2019 - 2024. All rights reserved.