我已经构建了一个指令,通过$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
可以用来确定两个对象是否相同的标志,还是有更好的方法来处理这种情况?
答案 0 :(得分:4)