เข้าถึง Viewchildren หลาย ๆ คนโดยใช้ @viewchild


149

ฉันได้สร้างส่วนประกอบที่กำหนดเองซึ่งฉันวางไว้ใน for loop เช่น

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

     <customcomponent></customcomponent>

</div>

ผลลัพธ์จะเป็น:

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

ฉันต้องการทราบว่าฉันจะได้รับการอ้างอิงถึงส่วนประกอบเหล่านี้โดยใช้ไวยากรณ์ @viewchild หรือวิธีอื่น ๆ ได้อย่างไรเมื่อจำนวนส่วนประกอบเหล่านี้อาจแตกต่างกันไป

เมื่อส่วนประกอบสามารถตั้งชื่อได้เช่น

<customcomponent #compID></customcomponent>

จากนั้นฉันสามารถอ้างอิงได้ดังนี้:

@ViewChild('compID') test: CustomComponent

ฉันจะอ้างอิงได้อย่างไรในเมื่อไม่เป็นเช่นนั้นเช่นอาจใช้ดัชนี

(คำถามนี้ไม่เกี่ยวข้องกับการใช้ ElementRef ตามคำถามอื่น ๆ ที่ถามก่อนหน้านี้ดังที่เห็นได้จากคำตอบด้านล่าง) คำถามนี้เกี่ยวข้องกับการเข้าถึง @ViewChild หลายรายการและการใช้การสืบค้นรายการ

คำตอบ:


244

ใช้@ViewChildrenจาก@angular/coreเพื่ออ้างอิงถึงส่วนประกอบ

แม่แบบ

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

ส่วนประกอบ

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 เป็นฟังก์ชันส่วนตัว นอกจากนี้ ส่วนประกอบเป็นเพียงส่วนประกอบเอกพจน์ไม่ใช่รายการสำหรับฉัน คุณสามารถให้ความช่วยเหลือเพิ่มเติมได้หรือไม่
Sam Alexander

20
@SamAlexander คุณสามารถใช้ this.components.toArray () เพื่อรับอาร์เรย์ของส่วนประกอบที่มีชื่อ
#cmp

2
มันทำงานอย่างไรกับการตอบสนองของ Ajax, @ViewChildren ถูกทริกเกอร์หลังจากการเริ่มต้นดู แต่ไม่ได้เกิดหลังจากการเปลี่ยนแปลงโมเดล (สำหรับ ngFor) ฉันจะเรียกสิ่งนั้นได้อย่างไร
elporfirio

1
@elporfirio implemet และเขียนวิธีการAfterViewChecked ngAfterViewCheckedเมธอดนี้จะถูกเรียกใช้ในแต่ละรอบการเปลี่ยนแปลงหลังจากอัปเดตมุมมองแล้ว ภายในนั้นคุณสามารถทดสอบว่าอินสแตนซ์ viewChild ของคุณถูกกำหนดไว้หรือไม่ ดูเอกสาร
BeetleJuice

1
ไม่เป็นไรฉันพบสิ่งนี้ซึ่งอธิบายสิ่งต่างๆโดยละเอียด: netbasal.com/…การใช้ชื่อขององค์ประกอบใน @ViewChildren ให้ผลลัพธ์ที่แตกต่างจากการใช้ #name ที่คุณกำหนดใน HTML
rmcsharry

75

ใช้มัณฑนากร @ViewChildren ร่วมกับ QueryList ทั้งสองอย่างนี้มาจาก "@ angular / core"

@ViewChildren(CustomComponent) customComponentChildren: QueryList<CustomComponent>;

การทำอะไรกับเด็กแต่ละคนดูเหมือนว่า: this.customComponentChildren.forEach((child) => { child.stuff = 'y' })

มีเอกสารเพิ่มเติมที่ angular.io โดยเฉพาะ: https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#sts=Parent%20calls%20a%20ViewChild

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.