Angular 'loading' 在子组件中等待 API
Angular 'loading' while waiting for API in child component
所以我有一个仪表板组件,它从各种 API 中检索数据,并将其作为 @Input()
市场数据传递给显示数据的信息框容器。
我想在等待此数据时显示一个加载符号。
我曾尝试使用 *ngIf
else 块,但这极大地降低了应用程序的速度,并使其在等待数据时无法更改导航。
dashboard.component.ts
const henryHubResponse = await this.marketDataService.getHenryHub().toPromise();
let henryHub = {
date: this.getDateEia(henryHubResponse.series[0].data[0][0]),
price: henryHubResponse.series[0].data[0][1].toFixed(2),
status: henryHubResponse.series[0].data[0][1] >= henryHubResponse.series[0].data[1][1] ? true : false,
}
this.marketData['HENRYHUB'] = henryHub;
仪表板-infobox.component.ts
<div class="exchange" *ngIf="marketData.HENRYHUB">
<p style="flex: 0 0 30%; margin-left: 15px;">
Henry Hub
</p>
<img matListAvatar [src]="marketData.HENRYHUB.status ? 'assets/img/up.png' : 'assets/img/down.png'" style="width: 20px" />
<p style="flex: 0 0 40%; margin-left: 15px;">
{{ marketData.HENRYHUB.price }} $/MMBtu
</p>
<p>
{{ marketData.HENRYHUB.date | date: 'MMM dd' }}
</p>
</div>
此代码在数据可用之前不会显示 ROW,因此我希望此 ROW 始终可见,但它可以显示“...”而不是 'price' 'loading'.
我试过这个:
<div class="exchange" *ngIf="marketData.HENRYHUB; else elseHENRYHUB">
<p style="flex: 0 0 30%; margin-left: 15px;">
Henry Hub
</p>
<img matListAvatar [src]="marketData.HENRYHUB.status ? 'assets/img/up.png' : 'assets/img/down.png'" style="width: 20px" />
<p style="flex: 0 0 40%; margin-left: 15px;">
{{ marketData.HENRYHUB.price }} $/MMBtu
</p>
<p>
{{ marketData.HENRYHUB.date | date: 'MMM dd' }}
</p>
</div>
<ng-template #else elseHENRYHUB>
<div class="exchange">
<p style="flex: 0 0 30%; margin-left: 15px;">
Henry Hub
</p>
<img matListAvatar [src]="marketData.HENRYHUB.status ? 'assets/img/up.png' : 'assets/img/down.png'" style="width: 20px" />
<p style="flex: 0 0 40%; margin-left: 15px;">
... $/MMBtu
</p>
<p>
{{ date | date: 'MMM dd' }}
</p>
</div>
</ng-template>
使用此方法后,DASHBOARD 组件变得非常慢。
还有...如果您使用 CDK 库,Overlay 组件无法正常工作?我说这个选项是因为您可以创建具有此功能的服务并且更易于管理。
例如:https://blog.thoughtram.io/angular/2017/11/20/custom-overlays-with-angulars-cdk.html
所以我有一个仪表板组件,它从各种 API 中检索数据,并将其作为 @Input()
市场数据传递给显示数据的信息框容器。
我想在等待此数据时显示一个加载符号。
我曾尝试使用 *ngIf
else 块,但这极大地降低了应用程序的速度,并使其在等待数据时无法更改导航。
dashboard.component.ts
const henryHubResponse = await this.marketDataService.getHenryHub().toPromise();
let henryHub = {
date: this.getDateEia(henryHubResponse.series[0].data[0][0]),
price: henryHubResponse.series[0].data[0][1].toFixed(2),
status: henryHubResponse.series[0].data[0][1] >= henryHubResponse.series[0].data[1][1] ? true : false,
}
this.marketData['HENRYHUB'] = henryHub;
仪表板-infobox.component.ts
<div class="exchange" *ngIf="marketData.HENRYHUB">
<p style="flex: 0 0 30%; margin-left: 15px;">
Henry Hub
</p>
<img matListAvatar [src]="marketData.HENRYHUB.status ? 'assets/img/up.png' : 'assets/img/down.png'" style="width: 20px" />
<p style="flex: 0 0 40%; margin-left: 15px;">
{{ marketData.HENRYHUB.price }} $/MMBtu
</p>
<p>
{{ marketData.HENRYHUB.date | date: 'MMM dd' }}
</p>
</div>
此代码在数据可用之前不会显示 ROW,因此我希望此 ROW 始终可见,但它可以显示“...”而不是 'price' 'loading'.
我试过这个:
<div class="exchange" *ngIf="marketData.HENRYHUB; else elseHENRYHUB">
<p style="flex: 0 0 30%; margin-left: 15px;">
Henry Hub
</p>
<img matListAvatar [src]="marketData.HENRYHUB.status ? 'assets/img/up.png' : 'assets/img/down.png'" style="width: 20px" />
<p style="flex: 0 0 40%; margin-left: 15px;">
{{ marketData.HENRYHUB.price }} $/MMBtu
</p>
<p>
{{ marketData.HENRYHUB.date | date: 'MMM dd' }}
</p>
</div>
<ng-template #else elseHENRYHUB>
<div class="exchange">
<p style="flex: 0 0 30%; margin-left: 15px;">
Henry Hub
</p>
<img matListAvatar [src]="marketData.HENRYHUB.status ? 'assets/img/up.png' : 'assets/img/down.png'" style="width: 20px" />
<p style="flex: 0 0 40%; margin-left: 15px;">
... $/MMBtu
</p>
<p>
{{ date | date: 'MMM dd' }}
</p>
</div>
</ng-template>
使用此方法后,DASHBOARD 组件变得非常慢。
还有...如果您使用 CDK 库,Overlay 组件无法正常工作?我说这个选项是因为您可以创建具有此功能的服务并且更易于管理。
例如:https://blog.thoughtram.io/angular/2017/11/20/custom-overlays-with-angulars-cdk.html