首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >$scope.apply()和$scope.apply(函数(){})的区别;

$scope.apply()和$scope.apply(函数(){})的区别;
EN

Stack Overflow用户
提问于 2013-11-06 13:56:18
回答 3查看 1.8K关注 0票数 5

取此代码:

代码语言:javascript
运行
复制
$scope.$apply(function(){
    $scope.foo = 'test';
});

相对于这个:

代码语言:javascript
运行
复制
$scope.foo = 'test';
$scope.$apply();

那两个有什么区别呢?我试着搜索,但没有找到任何有关这方面的信息。

甚至这种方法:

代码语言:javascript
运行
复制
$scope.$apply('foo = "test"');
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-06 14:07:57

你在评论中引用的文章是正确的。唯一的区别是,如果传入一个函数,该函数将在$digest循环的其余部分之前被“应用”(或$digest ed)。因此,如果您想要从角度上立即识别特定的更改(即在对所有其他更改进行评估之前),则应该传递一个函数。否则,$scope.$apply()$rootScope.$digest()没有区别。

这篇文章说:

$apply是什么?简单地说,它是$rootScope.$digest的包装器,它计算在调用$digest()之前传递给它的任何表达式。就这样。因此,如果您在不向其传递参数的情况下单独调用它,那么只需调用$digest()即可。

希望这能有所帮助。

票数 7
EN

Stack Overflow用户

发布于 2013-11-06 17:13:27

它很简单,考虑下面的例子

代码语言:javascript
运行
复制
$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
});

何地as

代码语言:javascript
运行
复制
$.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
EN

Stack Overflow用户

发布于 2016-03-07 15:54:12

我不相信被接受的答案是正确的。当AngularJS“消化”时,它会检查自上次调用$digest()以来在作用域中发生的任何更改。

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

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

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

$digest()怎么办?

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

因此,如果您只需要更新您的范围,那么调用$digest()就更有效了。

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19813981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档