【发布时间】:2021-11-02 22:39:11
【问题描述】:
所以我有这个带有图表的仪表板页面和一些带有数据的卡片。检索数据的函数在 ngOnInit() 中,但问题是当页面加载时,数据显示为 0。如果我单击图表或其他内容,则数据会加载。无论如何可以直接获取页面加载时的数据?我尝试设置一个布尔值,它将在 nginit 结束时变为真,但它仍然不起作用。
<div *ngIf="isLoaded">
Page here
</div>
这是 ts 文件。
export class DashboardAgentComponent implements OnInit {
totalAssigned=0;
totalAssignedHigh=0;
totalAssignedMed=0;
totalAssignedLow=0;
totalPending=0;
totalPendingHigh=0;
totalPendingMed=0;
totalPendingLow=0;
totalUnassigned=0;
public allTags$ = new BehaviorSubject<Tag[]>([]);
public threeDaysPending = 0;
public sevenDaysPending =0;
public fourteenDaysPending = 0;
public threeDaysAssigned = 0;
public sevenDaysAssigned =0;
public fourteenDaysAssigned = 0;
public isLoaded : boolean = false;
ngOnInit() :void{
this.getTotalAssigned();
}
public trackByFn = (i: number, tag: Tag) => tag.id;
getTotalAssigned()
{
this.mailboxTags.getTotalPending().subscribe((tags: Tag[]) => {
console.log(tags);
// this.allTags$.next(tags);
for (let index = 0; index < tags.length; index++) {
if(tags[index].name == 'pending' && tags[index].type=='view')
{
this.totalPending = tags[index].tickets_count;
}
else if(tags[index].name == 'unassigned')
{
this.totalUnassigned = tags[index].tickets_count;
}
else if(tags[index].name == 'assigned'&& tags[index].type=='view')
{
this.totalAssigned = tags[index].tickets_count;
}
}
});
this.getPendingTickets();
}
getPendingTickets()
{
this.mailboxTags.getPendingHighTickets().subscribe((res: any) => {
let currentDate: any = new Date();
for (let index = 0; index < res.pagination.data.length; index++) {
if(res.pagination.data[index].status=="pending")
{
let createdDate: any = new Date(res.pagination.data[index].created_at);
var diffDays:any = Math.floor((currentDate - createdDate) / (1000 * 60 * 60 * 24));
if(diffDays>3 && diffDays<7)
{
this.threeDaysPending++;
}
else if(diffDays>=7 && diffDays<14)
{
this.sevenDaysPending++;
}
else if(diffDays>=14)
{
this.fourteenDaysPending++;
}
}
}
for (let index = 0; index < res.pagination.data.length; index++) {
if(res.pagination.data[index].status=="assigned")
{
let createdDate: any = new Date(res.pagination.data[index].created_at);
var diffDays:any = Math.floor((currentDate - createdDate) / (1000 * 60 * 60 * 24));
if(diffDays>3 && diffDays<7)
{
this.threeDaysAssigned++;
}
else if(diffDays>=7 && diffDays<14)
{
this.sevenDaysAssigned++;
}
else if(diffDays>=14)
{
this.fourteenDaysAssigned++;
}
}
}
this.isLoaded = true;
});
}
constructor(private breakpointObserver: BreakpointObserver, public mailboxTags: MailboxTagsService) {}
}
基本上所有将使用的数据都在 ngOnInit 函数中。
这是html。它不完整,但其他类似。
<div class="grid-container" *ngIf="isLoaded == true">
<h1 class="mat-h1">Dashboard</h1>
<mat-grid-list cols="3" rowHeight="550px" colWidth="100px">
<mat-grid-tile class="grid-tile" [colspan]="1" [rowspan]="1">
<ng-container >
<mat-card class="dashboard-card" >
<mat-card-header>
<mat-card-title>
Unassigned
<button mat-icon-button class="more-button"
[matMenuTriggerFor]="menu" aria-label="Toggle menu">
<mat-icon>more_vert</mat-icon>
</button>
<mat-menu #menu="matMenu" xPosition="before">
<button mat-menu-item>Expand</button>
<button mat-menu-item>Remove</button>
</mat-menu>
</mat-card-title>
</mat-card-header>
<mat-card-content class="dashboard-card-content">
<div>{{totalUnassigned}}</div>
</mat-card-content>
</mat-card>
</ng-container>
</mat-grid-tile>
</mat-grid-list>
</div>
因此,totalUnassigned 为 0,除非我打开我的 matmenu 然后数据会更新。
【问题讨论】:
-
如果数据是异步加载的,那么您需要等待调用完成才能将isLoaded设置为true。您还可以查看 Angular Resolvers,它确保为调用 ngOnInit 加载数据。
-
@andyiscoding 检查我的更新答案
-
路由解析器对于这种情况来说是一个完美的功能。 angular.io/api/router/Resolve
-
@surajrawat 谢谢,我去看看
-
@Nathan 也感谢您推荐 Angular Resolvers
标签: angular typescript