ng2 - Ng-konteyner ve ng-şablon etiketleri arasındaki fark


96

Lütfen birisi kullanmak <ng-container>ve <ng-template>öğeler arasındaki farkı gösterebilir mi?

NgContainerŞablon etiketi için belge bulamadım ve arasındaki farkı tam olarak anlayamadım.

Her birinin bir kod örneği çok yardımcı olacaktır.

Yanıtlar:


105

Her ikisi de şu anda (2.x, 4.x) sayfada görüntülenecek başka bir öğeyi ( divveya gibi span) tanıtmak zorunda kalmadan öğeleri gruplamak için kullanılır .

templateancak, kötü sözdizimi gerektirir. Örneğin,

<li *ngFor="let item of items; let i = index; trackBy: trackByFn">...</li>

olacaktı

<template ngFor let-item [ngForOf]="items" let-i="index" [ngForTrackBy]="trackByFn">
  <li>...</li>
</template>

Bunun ng-containeryerine, *beklediğiniz ve muhtemelen zaten aşina olduğunuz güzel sözdizimini izlediği için kullanabilirsiniz .

<ng-container *ngFor="let item of items; let i = index; trackBy: trackByFn">
  <li>...</li>
</ng-container>

GitHub'daki bu tartışmayı okuyarak daha fazla ayrıntı bulabilirsiniz .


4.x sürümünün <template>kullanımdan kaldırıldığını ve olarak değiştirildiğini unutmayın <ng-template>.


Kullanım

  • <ng-container>*ngIfveya gibi iç içe geçmiş yapısal yönergeler için bir yardımcı elemana ihtiyacınız varsa *ngForveya böyle bir yapısal yönergenin içine birden fazla elemanı sarmak istiyorsanız;
  • <ng-template>Eğer bir görünüm gerekirse kullanarak çeşitli yerlerde damga istiyorum "pasajı" ngForTemplate, ngTemplateOutletya da createEmbeddedView().

8
"Kötü sözdizimi" biraz abartılmış olabilir: D Değerleri @Input()s'ye geçirmek için normal sözdizimidir . *elbette daha uygundur. Ama haklısınız, <ng-container>sözdizimi farklılıkları oldukça kafa karışıklığına neden olduğu için tanıtıldı.
Günter Zöchbauer

1
<ng-container>, DOM'da yeni öğe sunmaz. Peki ya <ng-template>? Lütfen cevabınızda açıklığa kavuşturun.
Jyoti Prasad Pal

1
Bu sayfa ne olduğunu anlamama yardımcı oldu: blog.angular-university.io/… .
Mikser

Bir tablonun satırlarını işlemek için n-container'ı ngFor ile nasıl kullanabilirim? bunu deniyorum ama çalışmıyor. Satır öğesinde ngFor'a sahip olabilmem için satırları koşullu olarak oluşturmak istiyorum.
Ahsan

19

ng-templateng-if, ng-forve gibi yapısal yönergeler için kullanılır ng-switch. Yapısal yönerge olmadan kullanırsanız, hiçbir şey olmaz ve işlenir.

ng-containeruygun bir paketleyiciniz veya ana kabınız olmadığında kullanılır. Çoğu durumda, kapsayıcı olarak divveya kullanıyoruz, spanancak bu gibi durumlarda birden çok yapısal yönergeyi kullanmak istediğimizde. Ancak bir eleman üzerinde birden fazla yapısal direktif kullanamayız, bu durumda ng-containerkonteyner olarak kullanılabilir


7

ng-şablon oluşturma HTML için Açısal unsurdur. Hiçbir zaman doğrudan gösterilmez. NgIf, ngFor, ngSwitch, .. gibi yapısal yönergeler için kullanın. Örnek :
<ng-template>

<div *ngIf="hero" class="name">{{hero.name}}</div>

Angular, * ngIf özniteliğini bunun <ng-template>gibi barındırıcı öğenin etrafına sarılmış bir öğeye çevirir .

<ng-template [ngIf]="hero">
  <div class="name">{{hero.name}}</div>
</ng-template>

ng-konteyner
Uygun bir barındırma öğesi olmadığında bir gruplama öğesi olarak kullanın.
Misal:

<div>
  Pick your favorite hero
  (<label><input type="checkbox" checked (change)="showSad = !showSad">show sad</label>)
</div>
<select [(ngModel)]="hero">
  <span *ngFor="let h of heroes">
    <span *ngIf="showSad || h.emotion !== 'sad'">
      <option [ngValue]="h">{{h.name}} ({{h.emotion}})</option>
    </span>
  </span>
</select>

Bu işe yaramayacak. Çünkü bazı HTML öğeleri, tüm alt öğelerin belirli bir türde olmasını gerektirir. Örneğin, <select>öğe çocuk gerektirir. Seçenekleri bir koşullu veya bir <span>.

Bunu dene :

<div>
  Pick your favorite hero
  (<label><input type="checkbox" checked (change)="showSad = !showSad">show sad</label>)
</div>
<select [(ngModel)]="hero">
  <ng-container *ngFor="let h of heroes">
    <ng-container *ngIf="showSad || h.emotion !== 'sad'">
      <option [ngValue]="h">{{h.name}} ({{h.emotion}})</option>
    </ng-container>
  </ng-container>
</select>

Bu çalışacak.

Daha fazla bilgi: Açısal Yapısal Yönerge


4

ng-şablonu gerçek değeri gösterir.

<ng-template>
    This is template block
</ng-template>

Çıktı:

Koşulsuz ng-konteyner gösterisi de içeriği gösterir.

<ng-container>
    This is container.
</ng-container>

Çıktı:
Bu konteynerdir.


1

ng-templateAdından da anlaşılacağı gibi, bir şablonu belirtir . Kendi başına hiçbir şey oluşturmaz. ng-containerBir şablonu dinamik olarak oluşturmak için bir yer tutucu sağlamak için a kullanabiliriz .

Başka bir kullanım durumu ng-template, onu birden çok yapısal yönergeyi bir araya getirmek için kullanabilmemizdir. Bu blog gönderisinde harika örnekler bulabilirsiniz: açısal ng-şablonu / ng-konteyner


1

Basit bir ifadeyle, yalnızca alt öğelerinin oluşturulmasına yardımcı olan React'inng-container bir Yüksek bileşeni gibidir .

ng-templatetemelde Angular'ın dahili uygulaması içindir , burada ng-templateoluşturma sırasında içindeki her şey tamamen yok sayılır ve temelde görünüm kaynağına ilişkin bir yorum haline gelir. Bunun, Angular'ın ngIf, ngSwitchvb. Gibi dahili yönergeleriyle kullanılması gerekiyordu .


0

Ben gibi <ng-container>Açısal .component.html dosyalarında mümkün olduğunca "biçimlendirme" dan "mantığı" ayırmak için bir yol olarak.

(kısmi) bir html tablosunun satırlarını oluşturmak için örnek:

        <ng-container *ngFor="let product of products">
          <tr>
            <td></td>
            <td>{{ product.productName }}</td>
            <td>{{ product.productCode }}</td>
            <td>{{ product.releaseDate }}</td>
            <td>{{ product.price }}</td>
            <td>{{ product.starRating }}</td>
          </tr>
        </ng-container>

Bu şekilde, bir HTML'den <table>başka bir şeye, örneğin <div>flexbox stiliyle değiştirmek istersem, döngü mantığını <tr>. Ayrıca döngü (ngFor) mantığının normal html tarafından kısmen engellenmesini de engeller.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.