Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么异步队列在观察者之前处理?_Javascript_Angularjs - Fatal编程技术网

Javascript 为什么异步队列在观察者之前处理?

Javascript 为什么异步队列在观察者之前处理?,javascript,angularjs,Javascript,Angularjs,在我基于AngularJS的应用程序中,元素a的可见性导致元素B的宽度变大或变小,这仅仅是因为元素CSS样式的设置方式。元素A的可见性是通过使用ng show=showRail绑定到作用域上的布尔值来切换的。由于我不需要在这里讨论的原因,当切换元素A的可见性时,我需要获取元素B的新宽度。如果我使用$timeout来计算元素B的宽度,我会得到一个准确的读数,但是下一帧太晚了,并且由于必须进行某些渲染而导致闪烁。我知道$evalAsync最适合在DOM更新之后但在浏览器呈现之前执行某些逻辑。因此,在

在我基于AngularJS的应用程序中,元素a的可见性导致元素B的宽度变大或变小,这仅仅是因为元素CSS样式的设置方式。元素A的可见性是通过使用ng show=showRail绑定到作用域上的布尔值来切换的。由于我不需要在这里讨论的原因,当切换元素A的可见性时,我需要获取元素B的新宽度。如果我使用$timeout来计算元素B的宽度,我会得到一个准确的读数,但是下一帧太晚了,并且由于必须进行某些渲染而导致闪烁。我知道$evalAsync最适合在DOM更新之后但在浏览器呈现之前执行某些逻辑。因此,在我切换showRail布尔值的处理程序上,我运行的是一个作用域。$evalAsync,但它似乎太早了,元素B仍然没有收到它的新宽度


我搜索了Angular的$digest方法,发现。在我看来,这似乎是倒退,并且似乎解释了为什么在我尝试检索元素B的新宽度之前,元素A的可见性没有改变。我希望有人能解释为什么会这样,也许这会引导我找到解决我具体问题的方法。谢谢。

看看setImmediate:


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

即使它是私有的,但是$$postDigest是您想要的吗?谢谢您的建议。我最终选择了这条路线来解决我的具体问题。