为了账号安全,请及时绑定邮箱和手机立即绑定

角度$ scope。$ apply与$ timeout作为安全的$ apply

角度$ scope。$ apply与$ timeout作为安全的$ apply

猛跑小猪 2019-10-09 15:58:56
我试图更好地理解在Angular中使用$ timeout服务作为一种“安全$ apply”方法的细微差别。基本上是在可以响应Angular事件或非Angular事件(例如jQuery或某些标准DOM事件)而运行一段代码的场景中。据我了解:在$ scope。$ apply中包装代码适用于您尚未处于摘要循环(又称为jQuery事件)的情况,但如果正在进行摘要则将引发错误在$ timeout()调用中包装没有延迟参数的代码无论是否已经在摘要周期中都有效查看Angular源代码,看起来$ timeout调用了$ rootScope。$ apply()。如果摘要周期已经在进行中,为什么$ timeout()也不会引发错误?最好的方法是使用$ scope。$ apply()(当您确定摘要尚未进行时)和$ timeout()(当需要以某种方式确保安全时)?是$ timeout()确实可以接受的“安全应用”,还是有陷阱?感谢您的见解。
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

如果我们在应用程序中大量使用$ apply,则可能会出现错误:$ digest已经在进行中。这是因为可以一次运行一个$ digest循环。我们可以通过$ timeout或$ evalAsync解决它。


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


我尝试在以下位置解释它们:apply,timeout,digest和evalAsync的比较。


可能会对您有帮助。

查看完整回答
反对 回复 2019-10-09
?
四季花海

TA贡献1811条经验 获得超5个赞

据我了解,它$timeout是一个包装器,在setTimeout其周围隐式调用$scope.$apply,这意味着它在角度生命周期之外运行,但会启动角度生命周期本身。我能想到的唯一“陷阱”是,如果您希望结果可用this $digest,则需要找到另一种“安全应用”的方法(AFAIK仅可通过访问$scope.$$phase)。


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 555 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信