Angular 6 UI 未更新

Angular 6 UI not updated

我有 3 个组件:

c1 包含 c2 和 c3

c2 包含一个复选框。切换复选框时,我会向输出变量触发一个事件。

<input type="checkbox" [checked]="displayAxialMap" (click)="onToggleAxialMap()" />

并在组件中:

onToggleAxialMap() {
    this.displayAxialMap = !this.displayAxialMap;
    this.toggleMap.emit(<Map>{ display: this.displayAxialMap, mapType: MapType.AXIALMAP, loading: true });
}

在 c1 中我有一个名为 displayMap 的 behaviorSubject

<c2 (toggleMap)="displayMap.next($event)"></c2>

在c1中我也将displayMap值传给了c3

<c3 [displayMap]="displayMap"></c3>

ngOnInit() 中的 c3 我这样做:

this.displayMap.subscribe(map => {
   this.loading = map.loading;
   this.drawAxialMapCanvas();
   this.loading = false;
}) 

this.loading 初始化为 false。

一切正常(因此通过组件传递数据没有问题)。但是 this.drawAxialMapCanvas();是一个需要很长时间才能完成的函数(3-4 秒),我看到了两种行为:

  1. c2 中的复选框仅在 this.drawAxialMapCanvas() 完成时更改为选中。
  2. 局部变量"loading" 在 c3 内部(如果我调试代码)正确地从 false 传递到 true 到 又假了但是,如果我将该变量放入模板中:

<...*ngIf"loading">正在加载...

它永远不会出现...它只需要最后一个值!

看来我的UI只有在this.drawAxialMapCanvas()完成时才会更新。 我做错了什么?

对于 1) 这是正常的,javascript 是单线程所以一切都被 this.drawAxialMapCanvas

阻塞

2) 您尝试显示加载消息,但您遇到了同样的问题,angular 未更新,因为 the.drawAxialMap 未完成并阻塞了线程(4 秒确实很长对于非异步加载)。

您可以先在下一个事件循环中创建 this.drawAxialMap 运行,方法是:

this.displayMap.subscribe(map => {
   this.loading = map.loading;
   setTimeout( () => {
    this.drawAxialMapCanvas();
    this.loading = false;
   )};
});

它会让时间刷新(checkbox, message..)

无论如何你应该对 this.drawAxialMapCanvas(); 做点什么; 我从来没有遇到过这种情况,但也许使用工作人员或通过使用 [setTimeout() / setImmediate()] 之类的东西来部分加载,让 UI 有时间管理用户事件等...