在我的Angular.js服务中,我不得不使用$rootScope.$apply()
,因此范围原始值将在视图中更新。
function scopeMutateSuccess(modalInstance, state){
//always worried about name collisions, so not
//useing $ to be safe
modalEventConfig.statusType = 'success';
modalEventConfig.nodeStatus = 'Completed Successfully';
$rootScope.$apply();
setTimeout(function() {
return modalInstance.close();
}, TIME_CLOSE_MODAL);
state.forceReload();
}
学习......我很好奇:
1)$digest()
比$apply()
便宜,因为它仅适用于本地范围......但这会对$rootScope
产生影响,因为它会横向扩展到所有子范围吗?
2)为了进行实验,我尝试了rootScope.$digest()
,并收到一条错误消息,指出摘要已在进行中。如果是这样的话 -
$apply()
时没有发生此错误,因为它也会调用$digest()
。$digest()
已在进行中,为什么我必须使用$apply()
使用新的范围成员值进行视图更新?答案 0 :(得分:1)
$digest()
只是观察者的触发器,当$apply
- 第一次运行由$apply
方法包装的逻辑时,仅在运行后$rootScope.$digest()
当为什么在使用$ apply()时不会发生此错误,因为它也调用$ digest()
$exceptionHandler
执行时,{p> $scope.$digest
无法处理$scope.$apply
(尝试/捕获)
提示:
setTimeout
方法时,使用$timeout
是不好的做法。 $rootScope.$apply();
我最好使用块样式:
$rootScope.$apply(function(){
// do your stuff here
});
您始终可以使用某种方法检查代码是否运行摘要周期:
isScopeOutCycle: function () {
return $rootScope.$root.$$phase != '$apply' && $rootScope.$root.$$phase != '$digest';
}