为什么 Angular 摘要循环在 UI 事件、$timeout和$http上有所不同



我一直在使用 1.2.27 为 Angular 开发一个库,令我惊讶的是,我正在查看以下结果:

$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
});

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

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

为什么 $$phase = UI 事件上的 $apply,$phase 美元 = $http 上的 $digest 美元,$timeout 上的 $$phase = null?它们本质上都是异步的,它们的行为如此不同是没有意义的。不过,我相信有一个很好的理由。有人知道吗?

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

$timeout

调在摘要循环结束时调用。

因此,由于您位于摘要循环之外,因此可以调用$apply,它将调用整个摘要循环。

对于其他方法(ng-click$http),它们在摘要循环中被调用。因此调用$apply会给出错误,因为 AngularJS 不希望摘要循环中的摘要循环。

最新更新