我一直在使用 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 不希望摘要循环中的摘要循环。