$ scope.apply();之间的差异;和$ scope.apply(function(){});

时间:2013-11-06 13:56:18

标签: angularjs

拿这段代码:

$scope.$apply(function(){
    $scope.foo = 'test';
});

与这一个:

$scope.foo = 'test';
$scope.$apply();

这两者有什么区别?我试过搜索但找不到任何相关的信息。

甚至这种方法:

$scope.$apply('foo = "test"');

3 个答案:

答案 0 :(得分:6)

您在评论中引用的文章是正确的。唯一的区别是,如果你传入一个函数,那么该函数将在$digest周期的其余部分之前被“应用”(或$digest ed)。因此,如果您希望Angular立即识别您的特定更改(意味着在评估所有其他更改之前),您应该传入一个函数。否则,$scope.$apply()$rootScope.$digest()之间没有区别。

文章说:

  

什么是$ apply?   简单地说,它是$ rootScope。$ digest的包装器,它在调用$ digest()之前计算传递给它的任何表达式。而已。所以,如果你自己调用它而不传递参数,你也可以只调用$ digest()。

希望有所帮助。

答案 1 :(得分:2)

简单,请考虑以下示例

$scope.$apply(function(){
   //lets say we write some conventional JS code like
   //make an ajax call using $.ajax() of jquery
   // the code runs in angular context and exception will be thrown if any error
});

其中

$.ajax({
   // in response update the $scope.foo = 400/0 ;
}); 
$scope.$apply();
//no exception will be thrown by angular, because its unaware of what you do outside its context

答案 2 :(得分:-2)

我不相信接受的答案是正确的。当AngularJS"摘要"它会检查自上次调用$digest()以来范围内发生了哪些变化。

对于$apply()$digest()会调用$rootScope,因此会调用所有子范围。

在函数体中调用$apply(function() {})和在代码之后调用$apply()之间唯一真正不同的是异常处理。

如果您将代码作为函数体的一部分传递给$apply()并且它抛出异常,则该异常将由$exceptionHandler处理。否则你将不得不自己处理这个例外。

$ digest()怎么样?

关于$apply()的讨论尚不完整,但未提及$digest()。在大多数情况下,$digest()比调用$apply()更有效,原因是$digest()仅处理当前范围,$apply()处理每个范围。

因此,如果您只需更新范围,则可以更有效地致电$digest()

那说当你使用$digest()时,你必须自己处理所有异常。与$apply()不同,$digest()不会进行任何异常处理。