拿这段代码:
$scope.$apply(function(){
$scope.foo = 'test';
});
与这一个:
$scope.foo = 'test';
$scope.$apply();
这两者有什么区别?我试过搜索但找不到任何相关的信息。
甚至这种方法:
$scope.$apply('foo = "test"');
答案 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()
不会进行任何异常处理。