ng-container
wird in der Dokumentation zu Angular 2 erwähnt, es gibt jedoch keine Erklärung, wie es funktioniert und was Anwendungsfälle sind.
Es wird insbesondere in den Anweisungen ngPlural
und ngSwitch
erwähnt.
Macht <ng-container>
dasselbe wie <template>
oder hängt es davon ab, ob eine Anweisung geschrieben wurde, um eine von ihnen zu verwenden?
Sind
<ng-container *ngPluralCase="'=0'">there is nothing</ng-container>
und
<template [ngPluralCase]="'=0'">there is nothing</template>
soll das gleiche sein?
Wie wählen wir einen von ihnen aus?
Wie kann <ng-container>
in benutzerdefinierten Anweisungen verwendet werden?
<ng-container>
zur RettungDer Angular
<ng-container>
ist ein Gruppierungselement, das die Formatvorlagen oder das Layout nicht beeinträchtigt, da es von Angular nicht in das DOM eingefügt wird.(...)
<ng-container>
ist ein vom Angular-Parser erkanntes Syntaxelement. Es ist keine Direktive, Komponente, Klasse oder Schnittstelle. Es ist eher wie die geschweiften Klammern in einem JavaScript-If-Block:if (someCondition) { statement1; statement2; statement3; }
Ohne diese geschweiften Klammern führt JavaScript die erste Anweisung nur dann aus, wenn Sie alle als bedingte Anweisungen als einen einzelnen Block ausführen möchten. Der
<ng-container>
erfüllt eine ähnliche Anforderung in Angular-Vorlagen.
Gemäß dieser Pull-Anfrage :
<ng-container>
ist ein logischer Container, der zum Gruppieren von Knoten verwendet werden kann, aber nicht in der DOM-Struktur als Knoten dargestellt wird.
<ng-container>
wird als HTML-Kommentar dargestellt.
also diese eckige Vorlage:
<div>
<ng-container>foo</ng-container>
<div>
erzeugt diese Art von Ausgabe:
<div>
<!--template bindings={}-->foo
<div>
ng-container
ist also nützlich, wenn Sie eine Gruppe von Elementen in Ihrer Anwendung anhängen möchten (dh *ngIf="foo"
), aber sie nicht mit einem anderen Element umschließen möchten.
<div>
<ng-container *ngIf="true">
<h2>Title</h2>
<div>Content</div>
</ng-container>
</div>
wird dann produzieren:
<div>
<h2>Title</h2>
<div>Content</div>
</div>
Die Dokumentation ( https://angular.io/guide/template-syntax#!#star-template ) enthält das folgende Beispiel. Sagen wir, wir haben Template-Code wie folgt:
<hero-detail *ngIf="currentHero" [hero]="currentHero"></hero-detail>
Bevor es gerendert wird, wird es "entzuckert". Das heißt, die Stern-Notation wird in die Notation übertragen:
<template [ngIf]="currentHero">
<hero-detail [hero]="currentHero"></hero-detail>
</template>
Wenn 'currentHero' wahr ist, wird dies als gerendert
<hero-detail> [...] </hero-detail>
Was aber, wenn Sie eine bedingte Ausgabe wie diese wünschen:
<h1>Title</h1><br>
<p>text</p>
.. und Sie möchten nicht, dass die Ausgabe in einem Container verpackt wird.
Sie können die de-sugared-Version direkt so schreiben:
<template [ngIf]="showContent">
<h1>Title</h1>
<p>text</p><br>
</template>
Und das wird gut funktionieren. Nun brauchen wir aber ngIf, um Klammern [] anstelle eines Sterns * zu haben, und das ist verwirrend ( https://github.com/angular/angular.io/issues/2303 )
Aus diesem Grund wurde eine andere Notation erstellt:
<ng-container *ngIf="showContent"><br>
<h1>Title</h1><br>
<p>text</p><br>
</ng-container>
Beide Versionen liefern die gleichen Ergebnisse (nur das h1- und das p-Tag werden gerendert). Der zweite wird bevorzugt, da Sie wie immer * ngIf verwenden können.
Imo-Anwendungsfälle für ng-container
sind einfache Ersetzungen, für die eine benutzerdefinierte Vorlage/Komponente zu viel wäre. Im API-Dokument wird Folgendes erwähnt
verwenden Sie einen Ng-Container, um mehrere Stammknoten zu gruppieren
und ich denke, darum geht es: Gruppieren von Sachen.
Beachten Sie, dass die ng-container
-Direktive nicht einer Vorlage entspricht, bei der die Direktive den tatsächlichen Inhalt umgibt.