我一直在使用1.2.27为Angular开发一个lib,令我惊讶的是我看到的结果是:

$scope.myClickMethod = function () {
  $scope.$$phase; // $apply
  $scope.$apply(); // Gives digest error, of course
};

$timeout(function () {
  $scope.$$phase; // null
  $scope.$apply(); // Does not give a digest error
});

$http.get('/').then(function () {
  $scope.$$phase; // $digest
  $scope.$apply(); // Gives digest error
});


问题是,使用$ timeout,$ http等(仅ng-clicks等)时,您无法确定摘要循环已准备好运行。我的问题是...为什么它们不同?我认为Angular在这两种情况下都做了这样的事情:

$scope.myClickMethod = function AngularWrapper () {
  $rootScope.$apply(function myOriginalMethod () {
    // My code
  });
};

$timeout(function AngularWrapper () {
  $rootScope.$apply(function myOriginalTimoutFunction () {
    // My code
  });
});


为什么在用户界面事件上应用$$ phase = $,在$ http上应用$$ phase = $ digest,在$ timeout上使用$$ phase = null?它们本质上都是异步的,因此它们的行为如此不同并不有意义。我敢肯定有一个很好的理由。有人知道吗

我看到1.3使用新的$ applyAsync方法对$ http进行了一些更改。虽然没有测试。

最佳答案

$timeout回调在摘要循环的末尾被调用。

因此,由于您不在摘要循环中,因此可以调用$apply,它将调用整个摘要循环。

对于其他方法(ng-click$http),它们在摘要循环中被调用。因此调用$apply会产生错误,因为AngularJS不需要在摘要循环中进行摘要循环。

10-05 19:49