除了setTimeout hack之外,是否有其他方法可以触发摘要循环(又名DOM更新)?

时间:2019-02-07 21:24:06

标签: angular

在我的应用程序中,我需要能够订阅一些事件,这些事件可以在打开或关闭侧面板时通知应用程序。面板的打开和关闭会更改视口的宽度,并且我在视口中运行了一个Monaco编辑器,此面板在切换为打开/关闭状态后需要更新。我的问题是Angular 1.x的经典摘要循环问题,尽管JS模型已正确更新,但该事件在UI进行物理更新之前发生。这意味着操作发生的顺序是:

  1. 触发面板“打开”
  2. PanelService发送“打开”事件
  3. 编辑器侦听事件并更新大小
  4. 摘要循环终于发生了,UI得到了更新

该顺序的问题是3出现在4之前,因此“更新大小”不起作用,因为它仍然使用与以前相同的大小。

但是,如果我将代码更改为这样:

setTimeout(() => {
    this.panelControlSource.next(new PanelOpenEvent());
}); 

然后突然间它将再次起作用,因为在摘要发生并且UI更新后,我强制触发此事件。这是我们一直在Angular 1.x中使用的一种技巧,目的是了解DOM何时真正更新并且元素更改大小。还是在Angular 2+(我使用Angular 7)中仍然是这样做的唯一方法,还是现在有一种最“ Angular”的方法?

0 个答案:

没有答案