5

拿这个代码:

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

对比这个:

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

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

甚至这种方法:

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

3 回答 3

7

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

文章说如下:

什么是 $apply?简单地说,它是$rootScope.$digest 的一个包装器,它在调用$digest() 之前评估传递给它的任何表达式。就是这样。所以,如果你在没有传递参数的情况下自己调用它,你也可以调用 $digest()。

希望有帮助。

于 2013-11-06T14:07:57.507 回答
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
于 2013-11-06T17:13:27.957 回答
-2

我不相信接受的答案是正确的。当 AngularJS “消化”时,它会检查自上次调用$digest().

在 , 的情况下$apply(),在所有子作用域上$digest()调用and 。$rootScope

$apply(function() {})在函数体中使用您的代码调用和在您的代码之后调用之间的唯一实际区别$apply()是异常处理。

如果您将代码作为函数体的一部分传递给$apply()并引发异常,则该异常将由$exceptionHandler. 否则,您将不得不自己处理该异常。

$digest() 呢?

一个关于的讨论$apply()是不完整的$digest()。在大多数情况下$digest()比调用更有效$apply(),原因是$digest()只处理当前作用域而$apply()处理每个作用域。

因此,如果您只需要更新您的范围,那么调用$digest().

也就是说,当您使用时,$digest()您必须自己处理所有异常。不像$apply(),$digest()不做任何异常处理。

于 2016-03-07T15:54:12.030 回答