首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >角$scope.$apply与$timeout作为安全$apply

角$scope.$apply与$timeout作为安全$apply
EN

Stack Overflow用户
提问于 2014-04-14 21:30:53
回答 3查看 30.9K关注 0票数 70

我正在努力更好地理解将$timeout服务作为一种“安全$apply”方法在角度上使用的细微差别。基本上,在这样的场景中,一段代码可以响应角事件或非角事件(如jQuery或一些标准DOM事件)运行。

据我所知:

  1. 在$scope.$apply中包装代码可以很好地处理那些您还没有进入摘要循环(也称为摘要循环)的场景。事件),但如果摘要正在进行,则会引发错误。
  2. 在没有延迟参数的$timeout()调用中包装代码,无论是否已经在摘要周期中工作

查看角源代码,它看起来像是$timeout调用了$rootScope.$apply()。

  1. 如果摘要周期已经在进行,为什么$timeout()也不会引发错误?
  2. 当您确信摘要不会正在进行时,使用$scope.$apply()的最佳实践是,在任何情况下都需要使用$timeout()吗?
  3. $timeout()真的是一个可以接受的“安全应用”吗?

谢谢你的见解。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-15 03:05:32

查看角源代码,它看起来像是$timeout调用了$rootScope.$apply()。

  • 如果摘要周期已经在进行,为什么$timeout()也不会引发错误?

$timeout使用了无文档化的角服务$browser。具体来说,它使用$browser.defer(),它通过window.setTimeout(fn, delay)异步地推迟函数的执行,而window.setTimeout(fn, delay)总是在角度生命周期之外运行。只有在window.setTimeout启动您的函数之后,$timeout才会调用$rootScope.$apply()

  • 当您确信摘要不会正在进行时,使用$scope.$apply()的最佳实践是,在任何情况下都需要使用$timeout()吗?

我可以这么说。另一个用例是,有时您需要访问一个您知道只有在摘要之后才会初始化的$scope变量。简单的示例是,如果您希望将窗体的状态设置为控制器构造函数中的脏状态(无论出于什么原因)。没有$timeout,FormController还没有初始化并发布到$scope上,因此将$scope.yourform.setDirty()封装在$timeout中可以确保FormController已经初始化。当然,您可以在不使用$timeout的情况下使用指令完成所有这些操作,只需给出另一个用例示例。

  • $timeout()真的是一个可以接受的“安全应用”吗?

它应该始终是安全的,但在我看来,使用方法应该始终以$apply()为目标。我正在开发的当前的角应用程序相当大,我们只需要依赖$timeout一次,而不是$apply()。

票数 63
EN

Stack Overflow用户

发布于 2015-07-27 09:12:33

如果我们在应用程序中大量使用$apply,我们可能会得到错误:$digest已经在进行中。发生这种情况是因为一次可以运行一个$digest循环。我们可以通过$timeout或$evalAsync来解决这个问题。

$timeout不会产生像"$digest已经在进行中“这样的错误,因为$timeout告诉角,在当前周期之后,有一个超时等待,这样可以确保在摘要周期之间不会发生任何冲突,因此$timeout的输出将在一个新的$digest周期上执行。

我试着在:应用、超时、摘要和evalAsync的比较解释他们。

也许它会对你有帮助。

票数 16
EN

Stack Overflow用户

发布于 2014-04-14 22:36:40

据我所知,$timeoutsetTimeout的包装器,含蓄地称为$scope.$apply,这意味着它运行在角度生命周期之外,但启动了角度生命周期本身。我能想到的唯一“理解”是,如果您期望您的结果在这个$digest上可用,那么您需要找到另一种“安全应用”的方法( AFAIK只能通过$scope.$$phase获得)。

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

https://stackoverflow.com/questions/23070822

复制
相关文章

相似问题

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