这是场景:
小提琴:
$scope.$watch('obj.value',function(val, oldVal) {
if (val === oldVal) return;
MyService.update($scope.obj, $scope.result).then(function(response){
$scope.results.push(response);
}, function(response) {
$scope.obj.value = oldVal;
$scope.results.push(response);
});
});
我在一个值上设置了一个手表,并在它发生变化时将其更新为 db。但是如果由于某种原因更新失败(连接问题、服务器错误、无效会话、权限不足等),我想将该值恢复到以前的版本。在小提琴中,您可以看到如果您选择“拒绝延迟”并尝试更改值会发生什么 - 它会启动失败请求、恢复值和 $watch 触发器的无限循环。
目前我正在范围上设置一个标志以指示请求失败并且下一个 $watch 不应调用该服务。但我正在寻找减少这种样板代码的方法。
当然,我总是可以使用其他一些方式来通知范围,例如 ng-change,但是我失去了对旧值的引用。我可以将参考保留在我的范围内,但这比目前的情况还要糟糕。
你有什么想法应该如何处理这些情况?基本上我正在寻找的是一种在 $watch 中更新模型而不触发进一步 $watches 的方法,如果这甚至可能的话。