当第三方窗口小部件更改其自己的活动数据源时,Meteor避免双重刷新

Bon*_*Oak 7 javascript javascript-events jstree meteor

我有一个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();
  }
});
Run Code Online (Sandbox Code Playgroud)

我想通过拖动jsTree中的内容来允许编辑数据库.这是它的样子:

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

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

如何防止这种不必要的更新,或者是否有更好的方法来构建我的jsTree接口,以防止出现此问题.

zer*_*isk 2

你见过这个吗?

看起来他/她正在使用autorunvs. 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)
}
Run Code Online (Sandbox Code Playgroud)

如果这是只有一个用户(一次)编辑的内容,那么您可能只是不根据数据库更新刷新它,而将树保留为仅供作者使用的界面。

如果需要根据数据库更新(来自其他用户,或者只是为了同步)进行刷新,您可以考虑更改您的工作流程/逻辑:

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

理论上,这应该只会导致 1 次刷新,而不是 2 次或 3 次刷新

或者,如果您确实想限制重新绘制...您可以找到旧的父节点新的父节点,并且只有我们refresh_node(obj)刷新这些更改节点:

刷新节点(对象)

刷新树中的节点(重新加载其子节点)该节点内所有打开的节点都会通过调用 load_node 重新加载。