@viewchild를 사용하여 여러 viewchildren에 액세스


149

예를 들어 for 루프에 배치 한 사용자 지정 구성 요소를 만들었습니다.

<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

@ViewChildrenfrom @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 이름을 가진 구성 요소의 배열을 얻을 수 있습니다
DavidGSola

2
Ajax 응답에서 어떻게 작동합니까?, @ViewChildren은 init View 후에 트리거되지만 모델 (ngFor의 경우) 변경 후에는 트리거되지 않습니다. 이를 위해 어떻게 트리거 할 수 있습니까?
elporfirio

1
@elporfirio implemet AfterViewChecked및 메소드 작성 ngAfterViewChecked. 이 메소드는보기가 업데이트 된 후 각 변경주기가 트리거됩니다. 그 안에서 viewChild 인스턴스가 정의되었는지 테스트 할 수 있습니다. 문서보기
BeetleJuice

1
신경 쓰지 마세요. netbasal.com/… @ViewChildren 의 구성 요소 이름을 사용하면 HTML에서 지정한 #name을 사용하는 것과 다른 반환 결과를 얻을 수 있습니다.
rmcsharry

75

QueryList와 결합 된 @ViewChildren 데코레이터를 사용하십시오. 둘 다 "@ 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.