@Viewchild kullanarak birden çok viewchild'e erişin


144

Bir for döngüsüne yerleştirdiğim özel bir bileşen oluşturdum, örneğin

<div *ngFor="let view of views">

     <customcomponent></customcomponent>

</div>

Çıktısı:

<customcomponent></customcomponent>
<customcomponent></customcomponent>
<customcomponent></customcomponent>

Bu bileşenlere @viewchild sözdizimi veya bu bileşenlerin sayısı değişebildiği zaman başka bir yol kullanarak nasıl referans alabileceğimi öğrenmek istiyorum

bileşene bir ad verilebildiğinde, örneğin

<customcomponent #compID></customcomponent>

Daha sonra aşağıdaki gibi referans verebilirim:

@ViewChild('compID') test: CustomComponent

Durum böyle değilse, örneğin bir indeks kullanarak nasıl referans verebilirim?

(Bu soru, aşağıda listelenen cevaplarda görülebileceği gibi, daha önce sorulan diğer sorularda olduğu gibi ElementRef'i kullanmakla ilgili değildir) Bu soru, birden fazla @ViewChild'e erişim ve liste sorgularının kullanılmasıyla ilgilidir.

Yanıtlar:


236

Kullanım @ViewChildrengelen @angular/corebileşenlerine bir başvuru almak için

şablon

<div *ngFor="let v of views">
    <customcomponent #cmp></customcomponent>
</div>

bileşen

import { ViewChildren, QueryList } from '@angular/core';

/** Get handle on cmp tags in the template */
@ViewChildren('cmp') components:QueryList<CustomComponent>;

ngAfterViewInit(){
    // print array of CustomComponent objects
    console.log(this.components.toArray());
}

l̶i̶v̶e̶ ̶d̶e̶m̶o̶


3
._results'un özel bir işlev olduğunu söylüyor. Ayrıca bu. bileşenler sadece tekil bir bileşen, bana göre bir liste değil. Sağlayabileceğin başka yardım var mı?
Sam Alexander

19
@SamAlexander #cmp adlı bileşen dizisini almak için this.components.toArray () kullanabilirsiniz
DavidGSola

2
Ajax yanıtında nasıl çalışır ?, @ViewChildren, init View'dan sonra tetiklenir, ancak model (ngFor için) değişikliklerinden sonra tetiklenmez. Bunu nasıl tetikleyebilirim?
elporfirio

@elporfirio implemet AfterViewCheckedve yöntemi yazın ngAfterViewChecked. Bu yöntem, görünüm güncellendikten sonra her değişiklik döngüsünü tetikler. İçinde, viewChild örneğinizin tanımlanıp tanımlanmadığını test edebilirsiniz. Belgelere bakın
BeetleJuice

1
Boşver, bunu daha ayrıntılı olarak açıklayan şunu buldum: netbasal.com/… @ViewChildren'de bileşenin adını kullanmak, HTML'de atadığınız #name kullanmaktan farklı bir sonuç verir.
rmcsharry

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.