Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在UI事件、$timeout和$http上角度摘要循环不同?_Javascript_Angularjs - Fatal编程技术网

Javascript 为什么在UI事件、$timeout和$http上角度摘要循环不同?

Javascript 为什么在UI事件、$timeout和$http上角度摘要循环不同?,javascript,angularjs,Javascript,Angularjs,我一直在使用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

我一直在使用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单击等。我的问题是。。。为什么它们不同?我认为Angular在这两种情况下都是这样做的:

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

$timeout(function AngularWrapper () {
  $rootScope.$apply(function myOriginalTimoutFunction () {
    // My code
  });
});
为什么$$phase=$apply on UI events,$$phase=$digest on$http,$$phase=null on$timeout?它们本质上都是异步的,它们的行为如此不同是没有意义的。不过,我相信有一个很好的理由。有人知道吗


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

在摘要循环结束时调用
$timeout
回调

因此,因为您在摘要循环之外,所以可以调用
$apply
,它将调用整个摘要循环


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

谢谢你的回答,但为什么会这样呢?我看不出他们为什么会有不同的行为。特别是$timeout和$http?这就是AngularJS的工作方式。我认为,
$timeout
是为了在摘要循环之后调用而创建的。有时候,你只需要完成摘要循环。嗯,我测试了$http,它实际上介于两者之间。见更新的问题。它确实给了error,但也给了$$phase一个$digest值。我想知道为什么-德赫,再次更新问题。我很想知道他们为什么会有不同的行为。我知道他们的行为确实不同,这可能有一个很好的理由,但这是什么好的理由呢?