angularjs – 角度$scope $apply vs $timeout作为安全$apply

前端之家收集整理的这篇文章主要介绍了angularjs – 角度$scope $apply vs $timeout作为安全$apply前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图更好地理解在Angular中使用$ timeout服务作为一种“安全$ apply”方法的细微差别。基本上在一段代码可以响应于Angular事件或非角事件(例如jQuery或一些标准DOM事件)运行的情况下。

据我所知:

>在$ scope中包装代码。$ apply适用于你的场景
都不在摘要循环(也称为jQuery事件),但如果摘要正在进行,则会引发错误
>在没有延迟参数的$ timeout()调用中包装代码无论是否已经在摘要周期中

看看Angular源代码,看起来像$ timeout会调用$ rootScope。$ apply()。

>为什么如果一个摘要周期已经在进行,$ timeout()也会引发一个错误
>是最好的做法是使用$ scope。$ apply()当你知道一个摘要不会已经在进行和$ timeout()当需要它是安全的吗?
>是$ timeout()真的是一个可接受的“安全应用”,还是有gotchas?

感谢任何洞察。

Looking at Angular source code,it looks like $timeout makes a call to
$rootScope.$apply().

  • Why doesn’t $timeout() also raise an error if a digest cycle is already in progress?

$ timeout使用一个未记录的Angular服务$ browser。具体来说,它使用$ browser.defer(),通过window.setTimeout(fn,delay)异步执行你的函数,它总是在Angular生命周期之外运行。只有一次window.setTimeout已经触发你的函数将$ timeout调用$ rootScope。$ apply()。

  • Is the best practice to use $scope.$apply() when you know for sure that a digest won’t already be in progress and $timeout() when needing it to be safe either way?

我会这样说。另一个用例是,有时你需要访问一个$ scope变量,你知道只有在digest之后才初始化。简单的例子是如果你想在控制器构造函数中设置一个窗体的状态为dirty(无论什么原因)。没有$ timeout FormController没有被初始化并发布到$ scope上,所以在$ timeout内包装$ scope.yourform.setDirty()可以确保FormController已经初始化。当然你可以做一个指令没有$超时,只是给另一个用例的例子。

  • Is $timeout() really an acceptable “safe apply”,or are there gotchas?

它应该总是安全的,但你的方法应该总是目标为$ apply()在我看来。我目前工作的Angular应用程序是相当大,我们只需要依赖$ timeout一次,而不是$ apply()。

原文链接:https://www.f2er.com/angularjs/146498.html

猜你在找的Angularjs相关文章