我一直在使用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不需要在摘要循环中进行摘要循环。