如何解决角度$ scope$ apply与$ timeout作为安全的$ apply
查看Angular源代码,看起来$ timeout调用了$ rootScope。$ apply()。
- 如果摘要周期已经在进行中,为什么$ timeout()也不会引发错误?
$timeout
使用未记录的Angular服务$browser
。具体来说,它使用$browser.defer()
,通过延迟异步执行函数window.setTimeout(fn,
delay)
,该函数将始终在Angular生命周期之外运行。仅window.setTimeout
触发一次函数就会$timeout
调用$rootScope.$apply()
。
- 当您确定摘要尚未进行时,使用$ scope。$ apply()是最佳实践吗?当需要使用任一方法来确保其安全性时,是使用$ timeout()吗?
我会这样说。另一个用例是,有时您需要访问一个$
scope变量,您知道该变量只会在摘要后初始化。一个简单的例子是,如果您想在控制器构造函数中将表单的状态设置为脏(无论出于何种原因)。没有$
timeout,FormController
它不会被初始化并发布到$ scope上,因此$scope.yourform.setDirty()
在$
timeout内包装可以确保FormController
已被初始化。当然,只要给出另一个用例示例,就可以使用不带$
timeout的指令来完成所有这些操作。
- 是$ timeout()确实可以接受的“安全应用”,还是有陷阱?
它应该总是安全的,但是我认为您的go方法应该始终以$ apply()为目标。我正在使用的当前Angular应用程序相当大,我们只需要依赖$ timeout一次,而不是$ apply()。
解决方法
我试图更好地理解在Angular中使用$ timeout服务作为一种“安全$
apply”方法的细微差别。基本上是在可能响应Angular事件或非Angular事件(例如jQuery或某些标准DOM事件)而运行一段代码的场景中。
据我了解:
- 在$ scope。$ apply中包装代码适用于您尚未处于摘要循环(又称为jQuery事件)的情况,但是如果正在进行摘要则将引发错误
- 在$ timeout()调用中包装没有延迟参数的代码无论是否已经在摘要周期中都有效
查看Angular源代码,看起来$ timeout调用了$ rootScope。$ apply()。
- 如果摘要周期已经在进行中,为什么$ timeout()也不会引发错误?
- 当您确定摘要尚未进行时,使用$ scope。$ apply()是最佳实践吗?当需要使用任一方法来确保其安全性时,是使用$ timeout()吗?
- 是$ timeout()确实可以接受的“安全应用”,还是有陷阱?
感谢您的任何见解。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。