Javascript 为什么在UI事件、$timeout和$http上角度摘要循环不同?
我一直在使用1.2.27编写Angular的lib,令我惊讶的是,我看到了这个结果: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
$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值。我想知道为什么-德赫,再次更新问题。我很想知道他们为什么会有不同的行为。我知道他们的行为确实不同,这可能有一个很好的理由,但这是什么好的理由呢?