Bio je to jedan od onih dana kad sam bio zauzet radom na novim značajkama za svoj uredski projekt. Odjednom mi je nešto privuklo pažnju:

Tijekom pregleda DOM-a vidio sam kako je ngcontent
Angular primijenio na elemente. Hmm ... ako sadrže elemente u konačnom DOM-u, što onda koristi ? U to sam se vrijeme zbunio između
i
.
U potrazi za odgovorima na svoja pitanja otkrio sam koncept . Na moje iznenađenje, bilo je i toga
*ngTemplateOutlet
. Započeo sam putovanje tražeći jasnoću oko dva koncepta, ali sada sam ih imao četiri, zvuče gotovo isto!
Jeste li ikad bili u ovoj situaciji? Ako da, onda ste na pravom mjestu. Dakle, bez daljnjega, uzmimo ih jednog po jednog.
1.
Kao što ime sugerira je predložak element koji Kutna koristi sa strukturnim direktiva (
*ngIf
, *ngFor
, [ngSwitch]
i prilagođene direktive).
Ovi elementi predloška rade samo u prisutnosti strukturnih direktiva . Angular omotava element domaćina (na koji se primjenjuje direktiva) unutrai troši
gotov DOM zamjenjujući ga dijagnostičkim komentarima.
Razmotrimo jednostavan primjer *ngIf
:

Gore je prikazano Kutno tumačenje *ngIf
. Angular stavlja element hosta na koji se direktiva primjenjuje unutar i zadržava hosta kakav jest. Konačni DOM sličan je onome što smo vidjeli na početku ovog članka:

Upotreba:
Vidjeli smo kako Angular koristi, ali što ako ga želimo koristiti? Kako ti elementi rade samo sa strukturnom direktivom, možemo zapisati kao:

Ovdje home
je boolean
svojstvo komponente koja je postavljena na true
vrijednost. Izlaz gornjeg koda u DOM-u:

Ništa nije prikazano! :(
Ali zašto ne možemo vidjeti svoju poruku čak i nakon ispravne uporabe sa strukturnom direktivom?
Ovo je bio očekivani rezultat. Kao što smo već razgovarali, Angular zamjenjuje dijagnostičkim komentarima. Nema sumnje da gornji kod ne bi generirao nikakvu pogrešku, jer je Angular sasvim u redu s vašim slučajem upotrebe. Nikad ne biste saznali što se točno dogodilo iza kulisa.
Usporedimo gornja dva DOM-a koja je prikazao Angular:


Ako pažljivo promatrate, postoji jedna dodatna oznaka komentara u konačnom DOM-u primjera 2 . Kôd koji je Angular protumačio bio je:

Angular je zamotao vašeg domaćina u drugi
i pretvorio ne samo vanjski
u dijagnostičke komentare već i unutarnji! Zbog toga niste mogli vidjeti nijednu svoju poruku.
Da biste se riješili ovoga, dva su načina da postignete željeni rezultat:

Metoda 1:
Ovom metodom Angularu dajete odšećereni format koji ne treba daljnju obradu. Ovaj će se put Angular pretvoriti samo u komentare, ali sadržaj u njemu ostavlja netaknutim (oni više nisu unutra
kao što je bio u prethodnom slučaju). Stoga će ispravno prikazati sadržaj.
Da biste saznali više o tome kako koristiti ovaj format s ostalim strukturnim smjernicama, pogledajte ovaj članak.
Metoda 2:
Ovo je prilično neviđen format i rijetko se koristi (pomoću dva brata ili sestre ). Ovdje dajemo referencu predložak u
*ngIf
u ITS then
to reći koji predložak treba koristiti ako je uvjet istinit.
Ne preporučuje se korištenje višestrukih poput ovih (
umjesto njih biste mogli koristiti ) jer ovo nije ono čemu su namijenjeni. Koriste se kao spremnik za predloške koji se mogu ponovno koristiti na više mjesta. O tome ćemo više pokriti u kasnijem odjeljku ovog članka.
2.
Jeste li ikad napisali ili vidjeli kod sličan ovome:

Razlog zašto mnogi od nas pišu ovaj kôd je nemogućnost upotrebe višestrukih strukturnih direktiva na jednom glavnom elementu u Angulu. Sada ovaj kod dobro funkcionira, ali uvodi nekoliko dodatnih praznih u DOM ako
item.id
je lažna vrijednost koja možda neće biti potrebna.

Jednostavnog primjera poput ovog možda ne brine, ali za ogromnu aplikaciju koja ima složeni DOM (za prikaz desetaka tisuća podataka) ovo može postati problematično jer elementi mogu imati priključene slušatelje koji će i dalje biti tamo u DOM sluša događaje.
Što je još gore, to je razina gniježđenja koju morate učiniti da biste primijenili svoj styling (CSS)!

Bez brige, moramo spasiti!
Angular je element za grupiranje koji ne ometa stilove ili raspored jer ga Angular ne stavlja u DOM .
Dakle, ako svoj primjer 1 napišemo sa :

Konačni DOM dobivamo kao:

Vidite da smo se riješili tih praznih s. Trebali bismo koristiti
kada samo želimo primijeniti više strukturnih direktiva bez uvođenja bilo kakvog dodatnog elementa u naš DOM.
Za više informacija pogledajte dokumente. Postoji još jedan slučaj upotrebe kada se koristi za dinamičko ubrizgavanje predloška u stranicu. O ovom ću slučaju govoriti u posljednjem odjeljku ovog članka.
3.
Koriste se za stvaranje komponenata koje se mogu konfigurirati. To znači da se komponente mogu konfigurirati ovisno o potrebama korisnika. Ovo je dobro poznato kao Projekcija sadržaja . Komponente koje se koriste u objavljenim knjižnicama koriste se kako bi se učinile konfigurabilnima.
Razmotrimo jednostavnu komponentu:


HTML sadržaj koji se prosljeđuje unutar početnih i završnih oznaka komponente je sadržaj koji se projicira. To je ono što nazivamo Projekcija sadržaja . Sadržaj će se prikazivati unutar
komponente. To omogućava potrošaču
komponente da proslijedi bilo koje prilagođeno podnožje unutar komponente i kontrolira točno kako želi da se ona generira.
Više projekcija:
Što ako možete odlučiti koji sadržaj treba smjestiti? Umjesto svakog sadržaja koji se projicira unutar jednog , također možete kontrolirati kako će se sadržaj projicirati s
select
atributom . Potreban je selektor elemenata da odluči koji će se sadržaj projicirati unutar određenog
.
Evo kako:

Izmijenili smo definiciju kako bismo izveli projekciju s više sadržaja.
select
Atribut odabir vrste sadržaja koji će biti donesena unutar određenog . Ovdje prvo
select
moramo generirati h1
element zaglavlja . Ako projicirani sadržaj nema h1
element, neće ništa prikazati. Slično tome, drugi select
traži a div
. Ostatak sadržaja prikazuje se unutar zadnjeg sa br
select
.
Pozivanje komponente izgledat će ovako:

4. * ngTemplateOutlet
... Koriste se kao spremnik za predloške koji se mogu ponovno koristiti na više mjesta. O tome ćemo više pokriti u kasnijem odjeljku ovog članka.... Postoji još jedan slučaj upotrebe kada se koristi za dinamičko ubrizgavanje predloška u stranicu. O ovom ću slučaju govoriti u posljednjem odjeljku ovog članka.
Ovo je odjeljak u kojem ćemo razgovarati o prethodno spomenute dvije točke. *ngTemplateOutlet
koristi se za dva scenarija - za umetanje zajedničkog predloška u različite odjeljke pogleda, bez obzira na petlje ili stanje, i za izradu visoko konfigurirane komponente.
Ponovna upotreba predloška:
Razmotrite prikaz u kojem morate umetnuti predložak na više mjesta. Na primjer, logotip tvrtke koji se postavlja unutar web mjesta. To možemo postići ako jednom napišemo predložak za logotip i ponovno ga upotrijebimo svugdje u prikazu.
Slijedi isječak koda:

Kao što vidite, samo smo jednom napisali predložak logotipa i koristili smo ga tri puta na istoj stranici s jednim retkom koda!
*ngTemplateOutlet
također prihvaća objekt konteksta koji se može proslijediti za prilagodbu zajedničkog izlaza predloška. Za više informacija o kontekstnom objektu pogledajte službene dokumente.
Prilagodljive komponente:
Drugi slučaj upotrebe *ngTemplateOutlet
su visoko prilagođene komponente. Razmotrimo naš prethodni primjer komponente s nekim izmjenama:

Iznad je modificirana verzija komponente koja prihvaća tri ulazne svojstva -
headerTemplate
, bodyTemplate
, footerTemplate
. Slijedi isječak za project-content.ts
:

Ovdje pokušavamo postići da prikažemo zaglavlje, tijelo i podnožje kako su primljeni od nadređene komponente . Ako bilo koji od njih nije naveden, naša će komponenta na svom mjestu prikazati zadani predložak. Dakle, stvaranje visoko prilagođene komponente.
Da biste koristili našu nedavno izmijenjenu komponentu:

Ovako ćemo proslijediti reference predloška našoj komponenti. Ako bilo koji od njih nije prošao, tada će komponenta prikazati zadani predložak.
ng-content vs. * ngTemplateOutlet
Oboje nam pomažu u postizanju visoko prilagođenih komponenata, ali koje odabrati i kada?
Jasno se može vidjeti da *ngTemplateOutlet
nam daje još veću snagu prikazivanja zadanog predloška ako nije naveden.
To nije slučaj sa ng-content
. Prikazuje sadržaj kakav jest. Sadržaj možete maksimalno podijeliti i prikazati na različitim mjestima vašeg pogleda uz pomoć select
atributa. Sadržaj ne možete uvjetno prikazati unutar ng-content
. Morate prikazati sadržaj koji je primljen od roditelja bez ikakvog načina donošenja odluka na temelju sadržaja.
Međutim, odabir odabira između ove dvije opcije u potpunosti ovisi o vašem slučaju korištenja. Barem sada *ngTemplateOutlet
u svom arsenalu imamo novo oružje koje pruža dodatnu kontrolu nad sadržajem uz značajke ng-content
!