AngularJS';s$scope.watch函数未在数据修改时启动

AngularJS';s$scope.watch函数未在数据修改时启动,angularjs,angularjs-directive,Angularjs,Angularjs Directive,当Chrome或FireFox的控制台打开时,您可以在这个plunk中看到问题: 当您第一次单击“推!”时,监视功能不会执行。但如果你再推一次,它就会执行。就好像它忽略了第一次推。但是,您可以清楚地看到,由于在后台执行超时函数,在第一次推送之后,数据点数组发生了变化。更奇怪的是,如果您注释掉jQuery fadeIn包装器,代码就会按预期工作(watch函数在第一次按下按钮时执行) 这是怎么回事?为什么使用jQuery().fadeIn时$watch函数没有执行?jQuery('#mytest

当Chrome或FireFox的控制台打开时,您可以在这个plunk中看到问题:

当您第一次单击“推!”时,监视功能不会执行。但如果你再推一次,它就会执行。就好像它忽略了第一次推。但是,您可以清楚地看到,由于在后台执行超时函数,在第一次推送之后,数据点数组发生了变化。更奇怪的是,如果您注释掉jQuery fadeIn包装器,代码就会按预期工作(watch函数在第一次按下按钮时执行)

这是怎么回事?为什么使用jQuery().fadeIn时$watch函数没有执行?

jQuery('#mytest').fadeIn(200,function(){
$scope.mydata.dataPoints.push(1);
$scope.$$phase | |$scope.$apply();
})
当fadeIn回调运行时,它运行“外部”角度,因此我们需要调用
$scope.$apply()
来运行一个。但是,如果对象已经可见,jQuery似乎会立即运行回调(因此我们仍然处于“内部”角度),因此我们不需要(也不应该)调用
$scope.$apply()

处理这两种情况的简单方法是使用私有属性
$$phase
检查我们是否已经处于摘要周期中。如果div已经可见,则更干净的实现是不调用
fadeIn()