$ watch等待太长时间才能识别出变化

时间:2014-05-02 03:51:04

标签: angularjs

这是控制器中的一些逻辑:

function newGame(){

     $scope.gameOver = true;

      $timeout(function(){

       //do stuff

       $scope.gameOver = false;

      }, 3000);

}

在我的指令中:

scope.$watch(scope.gameOver,function(){ console.log("changed!", scope.gameOver);})

我想基于scope.gameOver做点什么。我使用超时功能给游戏3秒的时间,其中gameOver = true。但是,在3秒钟内,watch不会执行任何操作,而是在3秒内结束时,scope.gameOver已经变为false。

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

设置$watch后,您的$watch回调函数至少会被调用一次,无论您的scope.gameOver变量是否发生变化。

official documentation

指出了这一点
  

在观察者注册观察者后,listener fn被异步调用(通过$evalAsync)来初始化观察者。

我认为您可能会遇到意外行为,因为您指定$watch原始值而不是对包含感兴趣值的变量的引用。

换句话说,

scope.$watch(scope.gameOver, function() { ... });

如您所指定的那样,与

相同
scope.$watch(true, function() { ... });

显然不会做任何有效的事情。

相反,更喜欢使用函数指定您的$watch以返回对scope.gameOver的引用,或者更好地利用$watch变量如何成为Angular表达式:

// Function to return reference to the variable to watch
scope.$watch(function() { return scope.gameOver; }, function() { ... });

// Expression for Angular to evaluate
scope.$watch('gameOver', function() { ... });

希望有所帮助。

答案 1 :(得分:0)

仅在watch参数更改时才会触发监视。因此,在您的代码中 $ scope.gameOver 仅在3秒结束时更改,因此触发手表。