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

时间:2014-08-15 16:17:01

标签: javascript angularjs

我在基于AngularJS的应用程序中遇到这种情况,其中元素A的可见性导致元素B的宽度变大或变小(仅仅因为元素CSS样式的设置方式)。通过使用ng-show="showRail"绑定到范围上的布尔值来切换元素A的可见性。由于我不需要进入这里的原因,当切换元素A的可见性时,我需要获得元素B的新宽度。如果我使用$timeout来评估元素B的宽度,我会得到一个准确的读数,但为时已晚(下一帧),并且由于某些渲染而导致闪烁,因此必须将其作为结果。我知道$evalAsync旨在最好在DOM更新之后但在浏览器呈现之前执行某些逻辑。所以在处理程序中我切换showRail布尔我运行scope.$evalAsync但是看起来太早了,元素B仍然没有收到新的宽度

我搜索了Angular的$ digest方法,发现asyncQueue is processed之前的watchers。这对我来说似乎很落后,似乎可以解释为什么在我尝试检索元素B的新宽度之前元素A的可见性没有改变。我希望有人可以解释为什么会这样,也许它会引导我解决我的具体问题。感谢。

1 个答案:

答案 0 :(得分:0)

看看setImmediate:

https://github.com/YuzuJS/setImmediate

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