$scope.$watch能够确定两个对象的等效性吗?
$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
是否可以接受一个标志来确定两个对象是否相等,或者是否有更好的处理这种情况的方法?
问题: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
回答者表示这正是他所需要的——可选的深度比较参数。感谢!
回答者回复说没问题,他第一次遇到这个问题时也是一样的。只要不要忘记将其标记为答案,以帮助其他人。谢谢!