0

您可以在 Chrome 或 FireFox 的控制台打开的情况下在这个 plunk 中看到问题:

http://plnkr.co/edit/jmDcxqQ48PmeHt3EPVMU

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

这里发生了什么?为什么使用 jQuery().fadeIn 时 $watch 函数没有执行?

4

1 回答 1

2
jQuery('#mytest').fadeIn(200, function() {
    $scope.mydata.dataPoints.push(1);
    $scope.$$phase || $scope.$apply();
})

当 fadeIn 回调运行时,它在“外部”Angular 运行,因此我们需要调用$scope.$apply()以运行摘要循环。但是,如果对象已经可见,那么 jQuery 似乎会立即运行回调(所以我们仍然在“内部”Angular),所以我们不需要(也不应该)调用$scope.$apply().

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

于 2013-05-31T15:47:53.527 回答