可以$ scope。$ watch确定两个对象的等价性吗?

时间:2013-10-06 21:12:39

标签: angularjs angularjs-directive

我已经构建了一个指令,通过$parse$attrs之一的Angular表达式中获取数据。表达式通常是应用于列表模型的简单过滤器,当父$scope被修改时,其评估将发生变化。

为了监视它何时应该更新它正在使用的数据,我的指令正在使用$scope.$watch调用,并使用自定义函数重新$ parse表达式。我遇到的问题是$parse将从表达式生成一个新的对象实例,因此即使每个对象中的数据完全等效,$watch也会将值视为已更改。这导致我的代码由于$digest回调中的操作而非常快地达到$watch迭代上限。

为了解决这个问题,我现在正在做以下事情:

 var getter = $parse($attrs.myExpression);
 $scope.$watch(function () {
    var newVal = getter($scope);
    if (JSON.stringify($scope.currentData) !== JSON.stringify(newVal)) {
      return newVal;
    } else {
      return $scope.currentData;
    }
  }, function (newVal) {
    $scope.currentData = newVal;
    // other stuff
  });

但是,我不喜欢在此处依赖JSON作为中间人,也不喜欢使用我的$watch'ed函数本身来评估旧值和新值的等效性。是否有$watch可以用来确定两个对象是否相同的标志,还是有更好的方法来处理这种情况?

1 个答案:

答案 0 :(得分:4)

您好,你应该使用它,

scope.$watch('data', function (newVal) { /*...*/ }, true);

这已在stackoverflow

上回答