Maîtrise des directives ng-template et ng-container dans les modèles Angular

Les directives structurelles ng-template et ng-container jouent un rôle crucial dans la gestion des modèles en Angular. Cet article détaille leur utilisation pratique.

Inrtoduction à ng-template

ng-template est une directive structurelle Angular qui définit un modèle HTML. Il n'est jamais rendu directement dans le DOM. Au lieu de cela, Angular le remplace par un commentaire lors du rendu. Si ng-template est utilisé sans directive structurele associée, son contenu reste invisible.

Des directives comme *ngFor ou *ngIf transforment en interne les attributs en éléments ng-template pour envelopper l'hôte.

Introduction à ng-container

ng-container sert de conteneur de regroupement sans ajouter d'élément supplémentaire au DOM, évitant ainsi la pollution des styles. Angular le traite comme un élément syntaxique, comparable aux accolades d'un bloc if en JavaScript.

Utilisations de ng-container

Cas 1 : Combinaison avec *ngFor et *ngIf

Lors de la combinaison de directives structurelles, ng-container permet d'éviter des div superflues.

<ul>
    <ng-container *ngFor="let element of dataList">
        <li *ngIf="element.detail">{{element.detail}}</li>
    </ng-container>
</ul>

Cas 2 : Utilisation avec ngSwitch

ng-container facilite l'utilisation de ngSwitch sans modifier la structure DOM.

<ng-container [ngSwitch]="contentType">
    <ng-container *ngSwitchCase="'heading'">Titre</ng-container>
    <ng-container *ngSwitchCase="'body'">Contenu</ng-container>
    <ng-container *ngSwitchDefault>Autre</ng-container>
</ng-container>

Cas 3 : Colllaboration avec ng-template

Ng-container peut servir à exporter des modèles réutilisables avec contexte via *ngTemplateOutlet.

<div>
    <div class="partie">
        <div class="etiquette">Première partie :</div>
        <div class="contenu">
            Nom de la première partie
            <ng-container *ngTemplateOutlet="description; context: {donnees: donnees.partieA}"></ng-container>
        </div>
    </div>
    <div class="partie">
        <div class="etiquette">Deuxième partie :</div>
        <div class="contenu">
            Nom de la deuxième partie
            <ng-container *ngTemplateOutlet="description; context: {donnees: donnees.partieB}"></ng-container>
        </div>
    </div>
    <ng-template #description let-donnees="donnees">
        <p>Description du contrat...</p>
    </ng-template>
</div>

*ngTemplateOutlet référence un modèle, tandis que *ngTemplateOutletContext fournit le contexte. La clé $implicit définit une valeur par défaut.

Utilisations de ng-template

Cas 1 : Avec *ngIf pour les conditions alternatives

<div *ngIf="donnees; sinon pasDeDonnees">{{donnees}}</div>
<ng-template #pasDeDonnees>
    <div class="message">Aucune donnée disponible</div>
</ng-template>

Cas 2 : Intégration avec des services de modaux

Les modèles peuvent être passés à des composants via TemplateRef.

<ng-template #modeleContenu>Contenu du modal...</ng-template>
export class AppComponent implements OnInit {
    @ViewChild('modeleContenu') modeRef: TemplateRef<any>;
    ngOnInit() {
        this.modalService.create({
            nzTitle: 'Titre',
            nzContent: this.modeRef
        });
    }
}

Cas 3 : Entrée dynamique de modèles dans les composants

Les composants peuvent accepter des modèles comme entrée pour une personnalisation flexible.

<div>
    <img src="" />
    <div>
        <ng-container [ngSwitch]="true">
            <ng-container *ngSwitchCase="estModele(texte)"
                [ngTemplateOutlet]="texte"
            ></ng-container>
        </ng-container>
        {{texte || ''}}
    </div>
</div>
export class ComposantVide {
    @Input() texte: TemplateRef<any> | string;
    estModele(val: any): boolean {
        return val instanceof TemplateRef;
    }
}

Étiquettes: Angular ng-template ng-container Directives structurelles TypeScript

Publié le 19 juin à 19h07