angular $ scope。$ watch for array

时间:2014-02-22 23:17:09

标签: angularjs asynchronous watch

根据这个: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);

没有任何反应......有什么想法可以吗?

3 个答案:

答案 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的一种方式:我已经做了一些背后的事情;请刷新。