<ng-container> - <template>


155

ng-container Angular 2 belgelerinde bahsedilmiştir ancak nasıl çalıştığı ve kullanım durumlarının ne olduğu ile ilgili bir açıklama yoktur.

Özellikle ngPluralve ngSwitchdirektiflerinde bahsedilmektedir .

<ng-container>Aynı şeyi mi yapıyor <template>yoksa bunlardan birini kullanmak için bir direktifin yazılmasına bağlı mı?

Are

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

ve

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

aynı olması mı gerekiyor?

Bunlardan birini nasıl seçeriz?

<ng-container>Özel direktifte nasıl kullanılabilir?

Yanıtlar:


255

Düzenleme: Şimdi belgelenmiştir

<ng-container> kurtarmak için

Angular  <ng-container> , Angular onu DOM'a koymadığı için stillere veya mizanpaja müdahale etmeyen bir gruplama öğesidir.

(...)

<ng-container> Açısal ayrıştırıcı tarafından tanınan bir söz dizimi elemanıdır. Bu bir yönerge, bileşen, sınıf veya arayüz değildir. Daha çok bir JavaScript if-bloğundaki süslü parantezlere benzer:

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

Bu parantezler olmadan, JavaScript yalnızca hepsini tek bir blok olarak koşullu olarak yürütmek istediğinizde ilk ifadeyi yürütür. <ng-container> Tatmin Açısal şablonlarına benzer bir ihtiyaç.

Orijinal cevap:

Göre bu çekme isteği :

<ng-container> düğümleri gruplamak için kullanılabilen ancak DOM ağacında düğüm olarak işlenmeyen mantıksal bir kapsayıcıdır.

<ng-container> bir HTML yorumu olarak oluşturulur.

bu açısal şablon:

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

bu tür çıktılar üretecek:

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

Bu ng-container, uygulamanızda bir grup öğeyi koşullu olarak eklemek istediğinizde (yani kullanarak *ngIf="foo") ancak bunları başka bir öğeyle sarmalamak istemediğinizde kullanışlıdır .

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

daha sonra üretecek:

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

İyi bir noktaya değindin. <template>Direktifler olmadan kullanılmasından farklı olduğunu tahmin ediyorum . <template>sadece <!--template bindings={}-->bu durumda üretecekti .
Estus Flask

Aslında <template></template>üretecek <script></script> Bunu görmek
n00dl3

Benim durumumda öyle değildi. <script>Derleme sırasında olsa bile , daha sonra kaldırılır, DOM'da fazladan etiket yoktur. Kılavuzun kullanımdan kaldırılmış bilgiler içerdiğine veya bu konuda yanlış olduğuna inanıyorum. Her neyse, <ng-container> ve <template> arasındaki temel farkı gösterdiğin için teşekkürler.
Estus Flask

Serbest bırakılmadan önce, Angular oluşturuldu <script></script>. Bir süredir böyle <!--template bindings={}-->bir şey yapıyor . Dokümanlar yakında düzeltilecek.
Ward

40

Belgeler ( https://angular.io/guide/template-syntax#!#star-template ) aşağıdaki örneği verir. Şöyle bir şablon kodumuz olduğunu varsayalım:

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

İşlenmeden önce "şekeri giderilir". Yani, asterix notasyonu gösterime kopyalanacaktır:

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

"CurrentHero" doğruysa, bu şu şekilde yorumlanacaktır:

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

Ama ya böyle bir koşullu çıktı istiyorsanız:

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

.. ve çıktının bir konteynere sarılmasını istemezsiniz.

Şekersiz versiyonu doğrudan şu şekilde yazabilirsiniz:

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

Ve bu iyi çalışacak. Ancak, şimdi yıldız işareti * yerine köşeli parantezlere [] sahip olmak için ngIf'e ihtiyacımız var ve bu kafa karıştırıcı ( https://github.com/angular/angular.io/issues/2303 )

Bu nedenle farklı bir gösterim oluşturuldu, şöyle:

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

Her iki sürüm de aynı sonuçları üretecektir (yalnızca h1 ve p etiketi görüntülenecektir). İkincisi tercih edilir çünkü her zaman olduğu gibi * ngIf kullanabilirsiniz.


Güzel açıklama, direktif fikrinin nasıl ng-containerortaya çıktığına dair genel bir bakış sunuyor , teşekkürler :)
Pankaj Parkar

0

Imo kullanım durumları, ng-containerözel bir şablonun / bileşenin gereğinden fazla olacağı basit değiştirmelerdir. API belgesinde aşağıdakilerden bahsediyorlar

Birden fazla kök düğümü gruplamak için bir ng-konteyner kullanın

ve sanırım her şey bununla ilgili: bir şeyleri gruplamak.

Unutmayın ng-containeryönergesi uzakta bunun yerine yönergesi gerçek içeriği sarar bir şablonun düşer.


Bu söze bir bağlantınız var mı? Şu anda yalnızca yukarıdaki bağlantılı belgelerde ve çoğul durum belgelerinde kullanıldığını görüyorum: angular.io/docs/ts/latest/api/common/index/… .
Koslun


1
Teşekkürler, dokümantasyon eksikliğiyle ilgili olarak dokümanlar sitesinde bir sorun oluşturdu ve şu yanıtı referans aldı: github.com/angular/angular.io/issues/2553
Koslun

1
-1 olumsuz oy verildi. ng-container, özel bir şablondan kaçınmakla ilgili değildir, bir kapsayıcıya sarılmamış koşullu içeriğe sahip olabilmekle ilgilidir. Aslında, özel bir şablon aynı zamanda bir sarmalayıcı kabı, yani yönerge etiketinin kendisini de sunacaktır.
Carlo Roosen

1
Kesinlikle haklısın. Bu kesinlikle belirtilmesi gereken bir farktır. İpucunu gönderime ekledim.
Matt

-1

* NgIf ve * ngFor ile bir tablo kullanmak istediğinizde bunun için bir kullanım durumu - td / th'ye bir div koymak gibi tablo elemanının yanlış davranmasına neden olacaktır -. Ben bu sorunla karşı karşıya ve bu cevap oldu.


1
Ancak aynı şey ile de elde edilebilir <template [ngIf]...>. Soru, bu iki yaklaşım arasındaki farktı.
Estus Flask

oh, benim hatam, burada yanıtlanmış gibi görünüyor stackoverflow.com/questions/40529537/… Sadece sözdizimi farkı olduğunu söylüyorlar
shakram02
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.