Javascript 已删除ng show泄漏$watch

Javascript 已删除ng show泄漏$watch,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,在这种情况下,我从后端接收json数据,然后使用带有一些ng show指令的模板进行呈现 <div> <span ng-show="config.displayMode == 'A'" class="ng-binding">${A}</span> <span ng-show="config.displayMode == 'B'" class="ng-binding">${B}</span> <span ng

在这种情况下,我从后端接收json数据,然后使用带有一些
ng show
指令的模板进行呈现

<div>
    <span ng-show="config.displayMode == 'A'" class="ng-binding">${A}</span>
    <span ng-show="config.displayMode == 'B'" class="ng-binding">${B}</span>
    <span ng-show="config.displayMode == 'C'" class="ng-binding">${C}</span>
</div>

${A}
${B}
${C}
当我收到下一组数据时,由于模板的工作方式,它只是删除当前元素并呈现新元素

这一切工作正常,似乎表现良好,但当我在巴塔朗性能工具,我看到我泄漏手表每次元素被删除。这个页面倾向于长时间保持打开状态,随着时间的推移,内存占用和摘要时间呈线性增长,这是我想要避免的

编辑使用jQuery的
.empty()
函数删除元素

根据请求,我创建了一个。该示例是超级精心设计的,但基本上,每次在框中键入内容时,它都会应用带有
ng show
的元素。如果该框清空,则会删除
ng show
元素。使用batarang,您可以看到手表仍然显示在“性能”选项卡上


我的问题是否有办法清除由
ng show
指令实例化的手表

如果我理解正确,这可能会解决您的问题:

app.directive('myDirective', function($compile) {
  return {
    restrict: 'A',
    scope: {
      myDirective: '='  
    },
    link: function($scope, elem, attr, ctrl) {
      $scope.$watch('myDirective', function(){
        if($scope.myDirective.length > 5){
          elem.append("<div class='second'>Length is greater than 5</div>")
        } else {
          elem.empty();
        }
      });
    }
  };
});
app.directive('myDirective',函数($compile){
返回{
限制:“A”,
范围:{
myDirective:“=”
},
链接:函数($scope、elem、attr、ctrl){
$scope.$watch('myDirective',function(){
如果($scope.myDirective.length>5){
元素追加(“长度大于5”)
}否则{
elem.empty();
}
});
}
};
});
代码中的问题是,没有真正从dom中删除元素。你只是把它们藏起来。所以观察者留下来了


剩余元素的屏幕截图,这些元素将无法与代码一起正确删除:

您是如何删除元素的?我实际上是在使用来显示数据,所以我不知道它是如何删除这些元素的。我知道它们不在DOM中,但我会打开源代码以了解它们是如何被删除的。我查看了源代码,它似乎在使用jQuery的
.empty()
函数删除所有子节点。您可以发布一个包含您试图实现的更广泛上下文的Plunkr吗?在我看来,我们正在处理一个架构问题。在angular.js中,尤其是在这种情况下,不应手动删除DOM元素。当您手动处理DOM时,唯一可以这样做的地方是一个指令。有几件事我可以说,但我需要先了解更多关于代码的信息。@RafalPastuszak我已根据请求添加了一个plunkr抱歉,但这并不能解决我的问题,因为您没有使用
ng show
隐藏或显示任何内容。这就是问题的根源,当元素被删除时,
ng show
中的
$watch
将保留在作用域中,您只会隐藏元素或清空它们,因此对我来说,$watch保留并不奇怪。元素仍然存在,但仅在CSS的帮助下隐藏。如果要删除“旧”观察程序,必须从DOM中删除整个元素。jQuery文档中说
.empty()
说明:从DOM中删除匹配元素集的所有子节点。当我在chrome中查看元素映射时,我没有看到元素剩余。你只需使用second类清空所有元素。您不会删除整个元素(包括ng show属性),只删除内容。因此,观察者仍然在那里。看我答案中的图片…哦,是的,我知道长度小于5只是隐藏了它。删除所有输入,元素将从DOM中删除,但观察者将保留。就像我说的,这是一个非常做作的例子