$ watcher计数在ng-repeat虚拟scolling中爆炸

时间:2016-03-30 14:49:43

标签: angularjs ng-repeat

我正在尝试在Angular using this guide as a reference中实现虚拟滚动树指令。但是,当我开始滚动时,$ watcher计数会爆炸到17k-20k +观察者(这会使页面崩溃),滚动一直很慢,我尝试过的任何东西似乎都没有帮助。

使用我当前代码的Plunker: HERE

(注意,上面没有在Firefox中显示,但在Chrome中工作)。如果您对我还能尝试的其他内容有任何想法,那么滚动不是灾难,我愿意接受想法。一直在研究这个问题太长了......

我尝试过的其他方法:

$compile(element.components())(scope.$new())

在onScroll()中调用。结果:该列表不再显示/仍然严重滞后,并且在页面崩溃之前我连续“无法在$ compile上调用null的insertBefore'”错误。

<li ng-repeat="node in nodeList" vs-node="node"></li>

Aka,我试图给每个元素一个独立的范围,希望在列表更新时它的范围和与之相关的任何观察者都会被销毁。结果与上述观察者问题没有区别。

function clearVisibleProvider(nodeList){
  for(var i=nodeList.length-1; i >= 0; i--){
    nodeList[i] = null;
  }
  return nodeList;

  function clearNode(node){
    if(node.nodes){
      for(var j=node.nodes.length-1; j >= 0; j--){
        clearNode(node.nodes[j]);
      }
    }
    nodeList[i] = null;
   }
}

尝试在替换之前清除旧列表元素。再一次,没有区别。在主列表更新之前,它在updateDisplayList()中被调用。

1 个答案:

答案 0 :(得分:0)

通过重新设计使用常规列表视图来实现我的目标。显示的节点被展平为一个列表,手动索引用于跟踪事物,并且没有嵌套。任何嵌套的元素都会根据树中的深度级别计算填充。

还有一个错误,我同时收到太多节点。而不是50,我得到200-500。然而,修复不能解决手表计数爆炸的问题,因此我不认为它是原始问题的根源。