为什么在观察者之前处理asyncQueue ?

Why is the asyncQueue processed before watchers?

本文关键字:asyncQueue 前处理 观察者 为什么      更新时间:2023-09-26

在我基于angularjs的应用程序中,元素a的可见性导致元素B的宽度变大或变小(只是由于元素CSS样式的设置)。通过使用ng-show="showRail"绑定到作用域上的布尔值来切换元素A的可见性。由于某些原因,我不需要在这里详细说明,当元素A的可见性被切换时,我需要得到元素B的新宽度。如果我使用$timeout来评估元素B的宽度,我得到一个准确的读数,但它太迟了(下一帧),并导致闪烁,由于一些渲染,必须做的结果。我明白,$evalAsync的目的是最好的执行一些逻辑后,DOM已更新,但在浏览器已经呈现。因此,在处理程序中,我正在切换showRail布尔值,我正在运行scope.$evalAsync,但似乎还为时过早,元素B仍然没有收到它的新宽度。

我搜索了Angular的$digest方法,发现asyncQueue是在观察者之前处理的。这对我来说似乎是向后的,似乎解释了为什么元素A的可见性在我试图检索元素B的新宽度之前没有改变。我希望有人能解释为什么会这样,也许它会引导我解决我的具体问题。谢谢。

看一下seimmediate:

https://github.com/YuzuJS/setImmediate

它几乎是为这种事情量身定做的。在Angular的核心中,没有任何东西可以让你控制这些操作的执行顺序,而"为什么"的答案也不会帮助你解决问题。但是setimate可以帮助你避免闪烁,如果它有效的话,可能是一个5分钟的解决方案…