Angular 2+ NgTemplateOutlet внутри ngFor

У нас есть несколько массивов, например:

  • heroes: Hero[];
  • villains: Villain[];
  • ...
  • puppies: Puppy[]

и такой шаблон

<p *ngFor="let individual of heroes">
    {{ individual.name }} - {{ individual.mobileNumber }}
    ...
</p>
    <p *ngFor="let individual of villains">
    {{ individual.name }} - {{ individual.mobileNumber }}
    ...
</p>
...
 <p *ngFor="let individual of puppies">
    {{ individual.name }} - {{ individual.mobileNumber }}
    ...
</p>

Петли *ngFor имеют одинаковое содержание. Чтобы упростить это, мы создаем один ng-template, который мы можем использовать повторно.

<ng-template let-individual #individualParagraphContent>
    {{ individual.name }} - {{ individual.mobileNumber }}
    ...
<ng-template>

Теперь мы хотим использовать его, например:

<p *ngFor="let individual of puppies">
  <ng-content *ngTemplateOutlet="individualParagraphContent;
              context: {individual: individual}">
  </ng-content>
</p>

Здесь я потерпел неудачу. Я нашел примеры, где весь цикл *ngFor находится в шаблоне и как передать значение из самого компонента, но мне не удалось вставить <ng-template> в цикл for и правильно передать переменную (индивидуальную).

ИЗМЕНИТЬ Решено. Все было хорошо, но инициализация в ng-template

<ng-template let-individual="individual" #individualParagraphContent>

person sevic    schedule 22.08.2018    source источник


Ответы (1)


Попробуйте что-то вроде этого:

<ng-container
    *ngFor="let individual of heroes"
    [ngTemplateOutlet]="individualParagraphContent"
    [ngTemplateOutletContext]="{individual: individual}"></ng-container>

и для шаблона:

<ng-template let-individual="individual" #individualParagraphContent>
    <p>
       {{ individual.name }} - {{ individual.mobileNumber }}
       ...
    </p>
<ng-template>

let-(x)="ключ для x в контексте"

person Julien METRAL    schedule 22.08.2018
comment
спасибо за ваш ответ! как только мы используем [ngTemplateOutlet]= вместо *ngTemplateOutlet= шаблон больше не отображается, кажется... я пытался использовать ngTemplateOutletContext по-разному, но так и не нашел правильного /: - person sevic; 22.08.2018
comment
ах, но все же благодаря ответу я нашел решение! все в примере из вопроса было хорошо, но шаблон. неправильно: <ng-template let-individual #individualParagraphContent> правильно: <ng-template let-individual="individual" #individualParagraphContent> спасибо! - person sevic; 22.08.2018
comment
Да, извините, [ngTemplateOutlet] используется в случае ngFor* : <ng-container *ngFor="let individual of puppies" [ngTemplateOutlet]="individualParagraphContent" [ngTemplateOutletContext]="{ individual: individual }"></ng-container> - person Julien METRAL; 22.08.2018