Angular 7,递归对象表行

时间:2019-04-03 08:08:22

标签: angular angular7 angular-template

假设我们有以下课程:

export class MyClass {
    field1: string,
    next: MyClass
}

我有一张表格,上面打印着MyClass的列表,但是在每个项目的内部,可以有一个next值。

<tr *ngFor="let c of _myclasses">
     <ng-template #recursive let-current>
         <td>{{cur.field1}}</td>
     </ng-template>
     <ng-container *ngTemplateOutlet="recursive; context {$implicit: c}"></ng-container>

</tr>

但是我有点卡在这里,因为我需要创建另一个tr或某行,但是我不知道怎么做。.

谢谢。

输出示例:

 let classes = [];

let class1 = new MyClass();
class1.field1 = 1;
class1.next = new MyClass();
class1.next.field1 = 5;

let class2 = new MyClass();
class2.field1 = 3;

classes.push(class1);



<tr>
    <td>1</td>
</tr>
<tr>
    <td>5</td>
</tr><tr>
    <td>3</td>
</tr>

2 个答案:

答案 0 :(得分:1)

要实现所需的功能,可以使用嵌套的ng-container

 <ng-container *ngFor="let c of _myclasses">
    <ng-container *ngTemplateOutlet="recursive; context {$implicit: c}"></ng-container>
 </ng-container>

 <ng-template #recursive let-current>
     <tr>
        <td>{{cur.field1}}</td>
     </tr>
    <ng-container *ngIf="cur.next">
         <ng-container *ngTemplateOutlet="recursive; context {$implicit: cur.next}"></ng-container>
    </ng-container>
 </ng-template>

或者也许您可以创建一个pipe,它递归地使用_myclassesflatten并返回一个一级对象数组。

答案 1 :(得分:0)

您做得差不多,只是做了一点纠正:

 <ng-template #recursive let-cur="current">
     <ng-template [ngIf]="cur">
         <tr>
             <td>{{cur.field1}}</td>
         </tr>
         <ng-container [ngTemplateOutlet]="recursive"
             [ngTemplateOutletContext]="{ current: cur.next }">
         </ng-container>
     </ng-template
 </ng-template>

<ng-template ngFor let-item [ngForOf]="_myclasses">
     <ng-container [ngTemplateOutlet]="recursive"
         [ngTemplateOutletContext]="{ current: item }">
     </ng-container>
</ng-template>

但是可能会觉得这看起来很奇怪并且太复杂了。在渲染之前将递归类展开为平面数组会更好吗?