根据这个:How to deep watch an array in angularjs?它应该有效,但我不知道我做错了什么......
$scope.$watch('statuses', function(newVal, oldValue) {
if (oldValue==newVal) return false;
console.log("st changed");
},true);
让我说我以某种方式异步更新$ scope.statuses例如3秒后
setTimeout(function() {
$scope.statuses.push("ahhh");
},3000);
没有任何反应......有什么想法可以吗?
答案 0 :(得分:2)
使用以下代码:
setTimeout(function() {
$scope.$apply(function () {
$scope.statuses.push("ahhh");
}
},3000);
你必须使用$ apply,因为AngularJS不知道更新到$ scope
为方便起见,AngularJS提供 $ timeout ,类似于setTimeout,但默认情况下会自动将代码包装在$ apply中。
答案 1 :(得分:1)
$scope.statuses = [];
$scope.$watch('statuses', function(newVal, oldValue) {
console.log(newVal, oldValue);
if (oldValue==newVal) return false;
console.log("st changed");
},true);
setTimeout(function() {
$scope.statuses.push("ahhh");
$scope.$apply();
},3000);
$ apply 函数用于通知$ scope的更新。
现场样本 http://plnkr.co/edit/LUjESyZOPfIALE2q5YYi?p=preview
如果状态仅包含原始值,请更好地使用$ watchCollection
答案 2 :(得分:1)
使用$timeout
的Angular版本setTimeout
。当您使用$timeout
时,AngularJS会在回调后重新绑定所有内容。
必须手动调用$apply
始终表示您没有采取行动角度方式。这是告诉Angular的一种方式:我已经做了一些背后的事情;请刷新。