Angular.js - 即使$ digest()已经在进行中,也必须使用$ apply() - 为什么?

时间:2014-08-23 22:11:41

标签: angularjs

在我的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(),并收到一条错误消息,指出摘要已在进行中。如果是这样的话 -

  • a)为什么在使用$apply()时没有发生此错误,因为它也会调用$digest()
  • b)由于$digest()已在进行中,为什么我必须使用$apply()使用新的范围成员值进行视图更新?

1 个答案:

答案 0 :(得分:1)

$digest()只是观察者的触发器,当$apply - 第一次运行由$apply方法包装的逻辑时,仅在运行后$rootScope.$digest()

  

为什么在使用$ apply()时不会发生此错误,因为它也调用$ digest()

$exceptionHandler执行时,{p> $scope.$digest无法处理$scope.$apply(尝试/捕获)


提示:

  • 当Angular提供setTimeout方法时,使用$timeout是不好的做法。
  • 而是致电$rootScope.$apply();

我最好使用块样式:

$rootScope.$apply(function(){                    
 // do your stuff here
});

您始终可以使用某种方法检查代码是否运行摘要周期:

isScopeOutCycle: function () {
        return $rootScope.$root.$$phase != '$apply' && $rootScope.$root.$$phase != '$digest';
}