这是控制器中的一些逻辑:
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。
这样做的正确方法是什么?
答案 0 :(得分:4)
设置$watch
后,您的$watch
回调函数至少会被调用一次,无论您的scope.gameOver
变量是否发生变化。
在观察者注册观察者后,
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秒结束时更改,因此触发手表。