Molemmat hakevat viittauksia lapsielementteihin/komponentteihin, mutta etsivät eri paikoista: @ViewChild hakee komponentin omasta mallinteesta, kun taas hakee komponenttiin sisällön kautta.
Molemmat hakevat viittauksia lapsielementteihin/komponentteihin, mutta etsivät eri paikoista: @ViewChild hakee komponentin omasta mallinteesta, kun taas hakee komponenttiin sisällön kautta.
@ContentChild<ng-content>@Component({
template: `
<input #nameInput /> <!-- a template reference in MY template -->
<app-child></app-child>
`,
})
export class ParentComponent implements AfterViewInit {
@ViewChild("nameInput") input!: ElementRef; // by template ref
@ViewChild(ChildComponent) child!: ChildComponent; // by component type
ngAfterViewInit() {
this.input.nativeElement.focus(); // available after the VIEW initializes
this.child.doSomething(); // call a child component's method
}
}
@ViewChild käyttää elementtejä/komponentteja, jotka komponentti itse julistaa mallinteeseensa — saatavilla ngAfterViewInit kohdassa.
@Component({
selector: "app-card",
template: `<div class="card"><ng-content></ng-content></div>`, // content projected here
})
export class CardComponent implements AfterContentInit {
@ContentChild(CardTitleComponent) title!: CardTitleComponent;
ngAfterContentInit() {
// the projected content is ready here (EARLIER than ngAfterViewInit)
console.log(this.title);
}
}
<!-- parent projects content INTO app-card -->
<app-card>
<app-card-title>Hello</app-card-title> <!-- this is what ContentChild finds -->
</app-card>
@ContentChild käyttää sisältöä, jonka vanhempi komponentti välitti (projisoidaan <ng-content> kautta) — saatavilla ngAfterContentInit kohdassa.
@ViewChild → elements in THIS component's own template → ngAfterViewInit
@ContentChild → elements PROJECTED in from the parent → ngAfterContentInit
(plural: @ViewChildren / @ContentChildren return a QueryList of all matches)
@ViewChildren(ItemComponent) items!: QueryList<ItemComponent>; // all matching items
ngAfterViewInit() { this.items.forEach(i => ...); this.items.changes.subscribe(...); }
input = viewChild<ElementRef>("nameInput"); // signal-based query (newer Angular)
@ViewChild (sinun mallinteesi) ja @ContentChild (projisoidun sisällön) erottaminen — ja niiden vastaavat elinkaaren ajoitukset (ngAfterViewInit vs ngAfterContentInit) — on olennaista rakennettaessa uudelleenkäytettäviä komponentteja, joiden on oltava vuorovaikutuksessa joko niiden omien mallinteiden elementtien kanssa tai sisällön kanssa, jonka kuluttajat projisioivat niihin.
Se on yleinen sekaannus ja tavallinen tarve komponenttikirjastojen, välilehdet, lomakenohjauskomentojen ja wrapper-koodien kirjoittamisessa, joiden täytyy koordinoida lapsielementtien kanssa.