AngularJS:$watch的执行顺序是什么?

3

我有一个监测函数:

scope.$watch('target', function(){
   scope.hasUnsavedChanges = true;
}, true);

然后我改变了一些值:

functiion change(target){
   scope.hasUnsavedChanges = false;
   scope.target.Xxx = '';
   console.log('scope.hasUnsavedChanges = ' + scope.hasUnsavedChanges); 
}

它的输出结果为false。那么watch函数是何时执行的呢?在上述代码中,当scope.hasUnsavedChanges变为true之后,如何运行一些代码呢?

1个回答

2

$watch函数在每次调用$scope.$digest()函数后执行。

如果您想在变量(如hasUnsavedChanges)变为真时执行代码,将其改为函数并在其中执行所有代码是否更有意义:

scope.setUnsavedChanges = function(){  
  scope.hasUnsavedChanges = true; 
  //the rest of your code goes here
}

scope.$watch('target', function(){
   scope.setUnsavedChanges();
}, true);

为了阐明OP的问题,由于$watch在digest期间触发,因此这绝不是紧随观察表达式结果差异之后立即发生的情况。换句话说,它不是更改对象导致初始摘要(尽管至少会跟随一个)。 - Marc Kline
@Dalorzo,非常感谢!但我只想运行一些代码来处理change()函数(如果$watch由其他函数触发,则不应执行该代码)。怎么做? - Zach
那么你为什么需要一个观察者呢?如果你知道在change中你正在改变target的值,那么就在更改完成后执行逻辑即可。 - Marc Kline
只要你赋值给target,它就会立即更改。仅仅因为$watch需要一点时间才能意识到这一点,并不意味着它没有发生。对吗? - Jerrad
@Marc Kline,我希望在$watch执行后运行代码。 - Zach
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接