对于堆栈溢出来说是新的,对Angular来说是相当新的-说到中级。
所以我遇到一个问题,即我正在使用* ngFor循环创建并填充HTML表的前三列,然后我想使用单独的* ngFor条件来遍历Firestore中的文档集合数据库来填充满足特定条件的表的行,直到最后一个要应用 if 条件以对内容应用两个选项之一的列。
混淆仅用文字来描述,因此这里有一些代码可以描绘出更好的画面:
用于创建HTML表的JSON:
tables: any [] = [
{
'time': 1200,
'number': 1,
'covers': 2
},
{
'time': 1200,
'number': 2,
'covers': 2
},
{
'time': 1200,
'number': 3,
'covers': 2
},
{
'time': 1230,
'number': 1,
'covers': 2
},
{
'time': 1230,
'number': 2,
'covers': 2
},
{
'time': 1230,
'number': 3,
'covers': 2
},
{
'time': 1300,
'number': 3,
'covers': 2
},
{
'time': 1300,
'number': 1,
'covers': 2
},
{
'time': 1300,
'number': 2,
'covers': 2
},
{
'time': 1300,
'number': 3,
'covers': 2
}
];
HTML表,其中filteredReservations是firestore获取请求返回的文档集合的数组:
<table class="table">
<thead>
<th>Time</th>
<th>Table</th>
<th>Covers</th>
<th>Name</th>
<th>Contact</th>
<th>Created By</th>
<th>Status</th>
<th>Actions</th>
</thead>
<tbody>
<tr *ngFor="let table of tables">
<td>{{table.time}}</td>
<td>{{table.number}}</td>
<ng-container *ngFor="let reservation of filteredReservations">
<ng-container *ngIf="table.time == reservation.time && table.number == reservation.table">
<td>{{reservation.covers}}</td>
<td>{{reservation.name}}</td>
<td>{{reservation.contact}}</td>
<td>{{reservation.createdBy}}</td>
<td>{{reservation.status}}</td>
<ng-container>
<td *ngIf="table.time == reservation.time && table.number == reservation.table; else empty">
<button mat-icon-button [routerLink]="['/new', reservation.id]">
<mat-icon>edit</mat-icon>
</button>
</td>
</ng-container>
</ng-container>
</ng-container>
</tr>
</tbody>
</table>
<ng-template #empty>
<td>
<button mat-icon-button [routerLink]="['/new']">
<mat-icon>edit</mat-icon>
</button>
</td>
</ng-template>
预期结果是将使用第一个* ngFor创建HTML表,filteredReservations将出现在满足条件的行中,最后一列将显示一个编辑图标,该图标将链接以添加新的保留或编辑满足条件的地方。
当我尝试实现我针对最后一列的目标时,重复次数与集合中有文档的次数相同,即我需要最后一列在filteredReservations循环之外,但仍使用保留数据检查是否条件。
我的目标是:1
我现在得到的是:2
我已尽力解释得最好,所以希望这是有道理的。
答案 0 :(得分:0)
我不会在html中进行迭代。最好在component.ts中这样做:
<tbody>
<tr *ngFor="let table of tables" >
<td>{{table.time}}</td>
<td>{{table.number}}</td>
<ng-template let-reservation="findReservation(table)">
<td>{{reservation.covers}}</td>
<td>{{reservation.name}}</td>
<td>{{reservation.contact}}</td>
<td>{{reservation.createdBy}}</td>
<td>{{reservation.status}}</td>
<td *ngIf="reservation">
<button mat-icon-button [routerLink]="['/new', reservation.id]">
<mat-icon>edit</mat-icon>
</button>
</td>
</ng-template>
</tr>
</tbody>
和
findReservation(table: Table): Reservation {
return this.filteredReservations.find(reservation => {/*your check*/})
}