97 votes

Angular - ng-template avec paramètre dans ngIf dans ngFor

J'essaie de construire ce modèle :

<ul>
    <li *ngFor='let link of links'>
        <ng-container *ngIf="link.type == 'complex'; then complexLink else simpleLink"></ng-container>
    </li>
</ul>

<ng-template #simpleLink>
    ...
    {{ link.some_property }}
</ng-template>

<ng-template #complexLink>
    ...
    {{ link.some_property }}
</ng-template>

Le problème est que la variable de lien est indéfinie dans le ng-template et que je reçois une erreur d'accès à 'some_property' d'undefined.

J'ai du mal à comprendre comment passer la variable de lien du ngFor au ng-template.

Il serait bon de savoir s'il existe plusieurs solutions à ce problème.

243voto

Vivek Doshi Points 18852

Vous pouvez le faire comme :

<ul>
    <li *ngFor='let link of links'>
        <ng-container 
             [ngTemplateOutlet]="link.type == 'complex' ?complexLink : simpleLink" 
             [ngTemplateOutletContext]="{link:link}">
        </ng-container>
    </li>
</ul>

<ng-template #simpleLink let-link='link'>
    Simple : {{ link.name }}
</ng-template>

<ng-template #complexLink let-link='link'>
    Complex : {{ link.name }}
</ng-template>

DÉMO DE TRAVAIL

0 votes

Bonjour Vivek, j'ai besoin de passer des valeurs externes comme la sortie pour accéder à [ngTemplateOutletContext] dans un autre composant se référer à ce plunker : plnkr.co/edit/lHFWI9KEHXPaJT4YKDkD?p=preview

3 votes

Votre réponse m'a aidé à comprendre le concept selon lequel chaque ng-template a son propre contexte de variables de modèle. Cela a fini par m'aider à construire une super page. Merci !

10 votes

Syntaxe mise à jour : <ng-container *ngTemplateOutlet="simpleLink; context: {link: link}"></ng-container> angular.io/api/common/NgTemplateOutlet

-18voto

Shrey Kejriwal Points 484

Vous pouvez l'utiliser de la manière suivante

<ul>
  <li *ngFor='let link of links'>
      <ng-container *ngIf="link.type == 'complex'; then complexLink else simpleLink"></ng-container>

      <ng-template #simpleLink>
          ... {{ link.some_property }}
      </ng-template>

      <ng-template #complexLink>
          ... {{ link.some_property }}
      </ng-template>
  </li>
</ul>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X