Truy cập nhiều viewchild bằng @viewchild


144

Tôi đã tạo một thành phần tùy chỉnh mà tôi đã đặt trong vòng lặp for, ví dụ:

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

     <customcomponent></customcomponent>

</div>

Kết quả đầu ra sẽ là:

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

Tôi muốn biết cách tôi có thể tham chiếu đến các thành phần này bằng cú pháp @viewchild hoặc bất kỳ phương tiện nào khác khi số lượng các thành phần này có thể thay đổi

khi thành phần có thể được đặt tên, ví dụ:

<customcomponent #compID></customcomponent>

Sau đó tôi có thể tham khảo nó như sau:

@ViewChild('compID') test: CustomComponent

Làm thế nào để tôi tham chiếu nó khi đây không phải là trường hợp, ví dụ: có thể sử dụng một chỉ mục?

(Câu hỏi này không liên quan đến việc sử dụng ElementRef như các câu hỏi khác đã được hỏi trước đây khi có thể thấy câu trả lời được liệt kê bên dưới) Câu hỏi này liên quan đến việc truy cập nhiều @ViewChild và sử dụng các truy vấn danh sách.

Câu trả lời:


236

Sử dụng @ViewChildrenfrom @angular/coređể tham khảo các thành phần

bản mẫu

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

thành phần

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());
}

bản thử trực tiếp


3
nó nói ._results là một hàm riêng tư. Ngoài ra điều này. các thành phần chỉ là một thành phần số ít không phải là một danh sách đối với tôi. Bạn có thể giúp gì thêm không?
Sam Alexander

19
@SamAlexander bạn có thể sử dụng this.components.toArray () để lấy mảng các thành phần có tên
#cmp

2
Nó hoạt động như thế nào trên phản hồi Ajax ?, @ViewChildren được kích hoạt sau khi init View, nhưng không phải sau khi mô hình (đối với ngFor) thay đổi. Làm thế nào tôi có thể kích hoạt điều đó?
elporfirio

@elporfirio áp dụng AfterViewCheckedvà viết phương thức ngAfterViewChecked. Phương pháp này được kích hoạt mỗi chu kỳ thay đổi sau khi chế độ xem đã được cập nhật. Trong nó, bạn có thể kiểm tra xem phiên bản viewChild của bạn đã được xác định hay chưa. Xem tài liệu
BeetleJuice

1
Đừng bận tâm, tôi thấy điều này giải thích mọi thứ chi tiết hơn: netbasal.com/… Sử dụng tên của thành phần trong @ViewChildren sẽ cho kết quả trả về khác với việc sử dụng #name mà bạn đã gán trong HTML.
rmcsharry

72

Sử dụng trình trang trí @ViewChildren kết hợp với QueryList. Cả hai đều từ "@ angle / core"

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

Làm điều gì đó với mỗi đứa trẻ trông giống như: this.customComponentChildren.forEach((child) => { child.stuff = 'y' })

Có thêm tài liệu tại angle.io, cụ thể là: https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#sts=Parent%20calls%20a%20ViewChild

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.