$scope.$watch能够确定两个对象的等效性吗?

14 浏览
0 Comments

$scope.$watch能够确定两个对象的等效性吗?

我已经编写了一个指令,通过$parse从我的$attrs中的Angular表达式获取数据。该表达式通常是应用于列表模型的简单过滤器,其评估将在修改父$scope时发生变化。\n为了监视何时更新使用的数据,我的指令使用了一个$scope.$watch调用,其中包含一个自定义函数,用于重新$parse表达式。我遇到的问题是,$parse将从表达式生成一个新的对象实例,因此$watch将将该值视为已更改,即使每个对象中的数据完全相同。这导致我的代码由于在$watch回调中采取的操作而很快达到$digest迭代上限。\n为了解决这个问题,我目前正在执行以下操作:\n

 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
  });

\n然而,我不喜欢在这里依赖JSON作为中间件,也不喜欢使用$watch的函数本身来评估旧值和新值的等价性。$watch是否可以接受一个标志来确定两个对象是否相等,或者是否有更好的处理这种情况的方法?

0
0 Comments

问题:Can $scope.$watch determine equivalency of two objects?

原因:在AngularJS中,使用$scope.$watch来监视对象的变化时,通常只会比较对象的引用是否相等,而不会比较对象的内容是否相等。这可能会导致在某些情况下无法正确检测到对象的变化。

解决方法:可以在$scope.$watch中添加第三个参数,即深度比较的标志。通过将该参数设置为true,可以使$scope.$watch比较对象的内容是否相等。

代码示例:

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

这个问题在stackoverflow上得到了解答,可以参考链接:stackoverflow.com

回答者表示这正是他所需要的——可选的深度比较参数。感谢!

回答者回复说没问题,他第一次遇到这个问题时也是一样的。只要不要忘记将其标记为答案,以帮助其他人。谢谢!

0