<ng-container> vs <шаблон>


150

ng-container згадується в документації Angular 2, але немає пояснень як це працює та які випадки використання.

Це, в зокрема , згадується в ngPluralі ngSwitchдирективи.

Чи <ng-container>те ж саме <template>, що чи, чи залежить, чи була написана директива щодо використання одного з них?

Є

<ng-container *ngPluralCase="'=0'">there is nothing</ng-container>

і

<template [ngPluralCase]="'=0'">there is nothing</template>

повинно бути те саме?

Як ми обираємо одну з них?

Як можна <ng-container>використовувати власну директиву?

Відповіді:


244

Правка: Тепер це документально підтверджено

<ng-container> на допомогу

Angular  <ng-container> - це групуючий елемент, який не заважає стилям чи компонуванню, оскільки Angular не розміщує його у DOM.

(...)

Елемент  <ng-container> синтаксису, розпізнаваний кутовим аналізатором. Це не директива, компонент, клас чи інтерфейс. Це більше схоже на фігурні дужки в if-блоку JavaScript:

  if (someCondition) {
      statement1; 
      statement2;
      statement3;
     }

Без цих дужок JavaScript буде виконувати перше твердження лише тоді, коли ви плануєте умовно виконати їх усі як єдиний блок. У  <ng-container> задовольняє аналогічна потреба в кутових шаблонів.

Оригінальна відповідь:

Відповідно до цього запиту на витяг :

<ng-container> є логічним контейнером, який можна використовувати для групування вузлів, але не відображається в дереві DOM як вузол.

<ng-container> надається як коментар HTML.

так що цей кутовий шаблон:

<div>
    <ng-container>foo</ng-container>
<div>

буде виробляти такий вид продукції:

<div>
    <!--template bindings={}-->foo
<div>

Тому ng-containerкорисно, коли ви хочете умовно додати групу елементів (тобто використовувати *ngIf="foo") у вашій програмі, але не хочете обернути їх іншим елементом .

<div>
    <ng-container *ngIf="true">
        <h2>Title</h2>
        <div>Content</div>
    </ng-container>
</div>

Потім вироблять:

<div>
    <h2>Title</h2>
    <div>Content</div>
</div>

Це хороший момент. Я здогадуюсь, що він відрізняється від того, <template>коли він використовується без директив. в цьому випадку <template>просто виробив би <!--template bindings={}-->.
колба Естуса

насправді, <template></template>буде виробляти <script></script> дивіться це
n00dl3

У моєму випадку це було не так. Навіть якщо є <script>під час компіляції, вона видаляється згодом, в DOM немає зайвих тегів. Я вважаю, що в посібнику є застаріла інформація або в цьому просто неправильно. У будь-якому випадку, дякую, що вказали на головну відмінність <ng-container> від <template>.
колба Естуса

Перед звільненням Angular винесло <script></script>. Це досить довго видавало щось подібне <!--template bindings={}-->. Документи незабаром будуть виправлені.
Уорд

40

Документація ( https://angular.io/guide/template-syntax#!#star-template ) дає такий приклад. Скажімо, у нас є такий шаблон шаблону:

<hero-detail *ngIf="currentHero" [hero]="currentHero"></hero-detail>

Перш ніж його винесуть, він буде "знешкоджений". Тобто позначення астериксу буде переписано на позначення:

<template [ngIf]="currentHero">
  <hero-detail [hero]="currentHero"></hero-detail>
</template>

Якщо "currentHero" є правдою, це буде відображено як

<hero-detail> [...] </hero-detail>

Але що робити, якщо ви хочете такого умовного виводу:

<h1>Title</h1><br>
<p>text</p>

.. і ви не хочете, щоб результат був загорнутий у контейнер.

Ви можете написати розроблену версію прямо так:

<template [ngIf]="showContent">
  <h1>Title</h1>
  <p>text</p><br>
</template>

І це буде добре працювати. Однак зараз нам потрібно ngIf мати дужки [] замість зірочки *, і це заплутано ( https://github.com/angular/angular.io/isissue/2303 )

З цієї причини було створено інше позначення, як-от так:

<ng-container *ngIf="showContent"><br>
  <h1>Title</h1><br>
  <p>text</p><br>
</ng-container>

Обидві версії дадуть однакові результати (відображатимуться лише теги h1 і p). Другий є кращим, оскільки ви можете використовувати * ngIf, як завжди.


Приємне пояснення, він пропонує огляд того, як ng-containerприйшла ідея директиви , дякую :)
Панкай Паркер

0

Imo випадки використання ng-containerє простими замінами, для яких нестандартний шаблон / компонент буде зайвим. В документі API вони згадують наступне

використовувати ng-контейнер для групування кількох кореневих вузлів

і я гадаю, що це все: групування речей.

Майте на увазі, що ng-containerдиректива відпадає замість шаблону, де її директива обгортає фактичний вміст.


Чи є у вас посилання на цю згадку? На даний момент ви бачите, як він використовується у вищезазначеній пов'язаній документації та множинній документації: angular.io/docs/ts/latest/api/common/index/… .
Кослун


1
Дякуємо, створили проблему на веб-сайті Документів щодо відсутності документації та посилалися на
Koslun

1
знижений -1. ng-контейнер не полягає у тому, щоб уникнути спеціального шаблону, це про те, щоб мати змогу мати умовний вміст, який не загорнутий у контейнер. Насправді користувацький шаблон також буде містити контейнер для обгортки, а саме тег директиви.
Карло Рузень

1
Ти абсолютно правий. Це точно є різницею, яку потрібно згадати. Я додав підказку до своєї публікації.
Мет

-1

Випадок використання для нього, коли ви хочете використовувати таблицю з * ngIf та * ngFor - Оскільки введення div у td / th зробить елемент таблиці неправильним -. Я зіткнувся з цією проблемою, і це була відповідь.


1
Але того ж можна досягти і з <template [ngIf]...>. Питання полягало в різниці між цими двома підходами.
колба Естуса

о, шкода, здається, тут відповіли stackoverflow.com/questions/40529537/… вони просто кажуть, що це лише різниця в синтаксисі
shakram02
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.