据我所知:
>在$ 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()。