Alih-alih menyuntikkan ElementRef
dan menggunakan querySelector
atau serupa dari sana, cara deklaratif dapat digunakan sebagai gantinya untuk mengakses elemen dalam tampilan secara langsung:
<input #myname>
@ViewChild('myname') input;
elemen
ngAfterViewInit() {
console.log(this.input.nativeElement.value);
}
Contoh StackBlitz
- @ViewChild () mendukung direktif atau tipe komponen sebagai parameter, atau nama (string) dari variabel templat.
- @ViewChildren () juga mendukung daftar nama sebagai daftar yang dipisahkan koma (saat ini tidak ada spasi yang diizinkan
@ViewChildren('var1,var2,var3')
).
- @ContentChild () dan @ContentChildren () melakukan hal yang sama tetapi dalam cahaya DOM (
<ng-content>
elemen yang diproyeksikan).
keturunan
@ContentChildren()
adalah satu-satunya yang memungkinkan untuk meminta keturunan
@ContentChildren(SomeTypeOrVarName, {descendants: true}) someField;
{descendants: true}
seharusnya default tetapi bukan di 2.0.0 final dan itu dianggap bug.
Ini diperbaiki di 2.0.1
Baca
Jika ada komponen dan arahan, read
parameter memungkinkan untuk menentukan contoh mana yang harus dikembalikan.
Misalnya ViewContainerRef
yang diperlukan oleh komponen yang dibuat secara dinamis, bukan defaultElementRef
@ViewChild('myname', { read: ViewContainerRef }) target;
berlangganan perubahan
Meskipun tampilan anak-anak hanya diatur saat ngAfterViewInit()
dipanggil dan konten anak-anak hanya ditetapkan saat ngAfterContentInit()
dipanggil, jika Anda ingin berlangganan perubahan hasil permintaan, itu harus dilakukan dalamngOnInit()
https://github.com/angular/angular/issues/9689#issuecomment-229247134
@ViewChildren(SomeType) viewChildren;
@ContentChildren(SomeType) contentChildren;
ngOnInit() {
this.viewChildren.changes.subscribe(changes => console.log(changes));
this.contentChildren.changes.subscribe(changes => console.log(changes));
}
akses DOM langsung
hanya dapat meminta elemen DOM, tetapi tidak komponen atau instance direktif:
export class MyComponent {
constructor(private elRef:ElementRef) {}
ngAfterViewInit() {
var div = this.elRef.nativeElement.querySelector('div');
console.log(div);
}
// for transcluded content
ngAfterContentInit() {
var div = this.elRef.nativeElement.querySelector('div');
console.log(div);
}
}
dapatkan konten yang diproyeksikan sewenang-wenang
Lihat Mengakses konten yang ditransklusikan