今天对于Angular ng没有好的答案如果异步/可观察到的状态更改错误

谷歌搜索似乎几乎所有曾经涉猎Angular的人都曾遇到过此问题:

您使用*ngIf指令创建Dom元素:

<div *ngIf="array.length">
Don't show me until I'm ready please !
</div>

您当场评估是否应该建立子域。

然后,例如,您以api响应的形式接收数据:

 this.http.post(
      this.url,args,this.authenticationService.getRequestOptions()
    ).subscribe(data => {
        this.array = data;
        console.log('truthy? : ',this.array.length);
    }
 );

由于某种原因,角度更改检测此时失败,并且*ngIf Dom节点未评估并变为可见。

即使您的控制台给了您:

truthy? : 1

这是怎么回事,什么是最好的方法?

bonwemeters 回答:今天对于Angular ng没有好的答案如果异步/可观察到的状态更改错误

问题是changeDetect在ngOnInit生命周期中出于所有目的均已关闭。 (并且您应该考虑将之前的事情(例如构造函数)关闭)

仅在ngAfterViewInit生命周期中才会启动changeDetect。

通过在ngAfterViewInit中调用我的API,我得到了正确的结果。

,

仅提及另一种可能的解决方案。

这也是典型的做法:

someObservable$ = this.http.post(
          this.url,args,this.authenticationService.getRequestOptions()
);

// or if getRequestOptions() somehow returns an observable:

someObservable$ = this.authenticationService.getRequestOptions().pipe(
    mergeMap((options) => {
        return this.http.post(this.url,options);
    })
);
<div *ngIf="(someObservable$ | async)?.length">
    Don't show me until I'm ready please !
</div>

请注意,此示例代码段可能缺少一些内容,例如避免执行多个(发布)请求

本文链接:https://www.f2er.com/3109471.html

大家都在问