Угловой 7, строки таблицы рекурсивных объектов - PullRequest
0 голосов
/ 03 апреля 2019

Предположим, у нас есть следующий класс:

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 ]

1 голос
/ 03 апреля 2019

Чтобы достичь того, что вам нужно, вы можете использовать вложенные 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, который принимает _myclasses и flatten рекурсивнои возвращает одноуровневый массив объектов.

0 голосов
/ 03 апреля 2019

Вы сделали почти правильно, просто небольшая поправка:

 <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>

Но на первый взгляд это выглядит странно и слишком сложно.Может быть, лучше просто развернуть этот рекурсивный класс в плоский массив перед рендерингом?

...