CODE

[Angular]@ViewChild로 자식 컴포넌트 제어

Angular

[Angular]@ViewChild로 자식 컴포넌트 제어

앞서 @Input(), @Output 데코레이터를 사용하여 부모-자식 컴포넌트 간에 데이터를 공유하는 방법을 학습했다. 이번에는 데이터를 공유할 뿐만 아니라 부모 컴포넌트에서 자식 컴포넌트를 직접 제어할 수 있는 @ViewChild에 대해서 알아보자. 여기서 제어할 수 있는 영역은 컴포넌트, DOM, Directive 등이 있다.

ViewChild란 부모 컴포넌트 템플릿 안에 있는 자식 요소들을 의미한다.
<div class="bookSearch-outer"> 
    
    <div class="d-flex align-items-center p-3 my-3 text-white-50 bg-purple rounded box-shadow"> 
        <img class="mr-3" src="assets/images/search-icon.png" alt="" width="48" height="48"> 
        <div class="lh-100"> 
            <h5 class="mb-0 text-white lh-100">Search Result : </h5> 
        </div> 
    </div> 
    
    <div class="example-container"> 
        <mat-form-field> 
            <mat-select placeholder="도서종류" #bookCategorySelect [(ngModel)]="selectedValue" (ngModelChange)="changeValue(bookCategorySelect.value)"> 
                <mat-option *ngFor="let category of bookCaterory" [value]="category.value"> </mat-option> 
            </mat-select> 
        </mat-form-field> 
        <button mat-raised-button color="primary" (click)="clearCondition()">검색 초기화</button>
     </div> 
     
     <div>
        <app-search-box [bookCategory]="displayCategoryName" (searchEvent)="changeTitleBar($event)"></app-search-box> 
    </div> 
    
    <div>
        <app-detail-box></app-detail-box> 
    </div> 
    
    <div> 
        <app-list-box></app-list-box> 
    </div> 
    
</div>
import {Component, OnInit, ViewChild, ViewChildren, QueryList } from '@angular/core'; 
import { SearchBoxComponent } from "../search-box/search-box.component";

  @Component({ 
    selector: 'app-book-search-main',
      templateUrl: './book-search-main.component.html',
      styleUrls: ['./book-search-main.component.css', './offcanvas.css']
  }) 
  
  export class BookSearchMainComponent implements OnInit {
    
    selectedValue = null; 
    displayCategoryName = null; 
    
    bookCaterory = [ 
      {value: 'all', viewValue: '국내외도서'}, 
      {value: 'country', viewValue: '국내도서'}, 
      {value: 'foreign', viewValue: '국외도서'} ]; 
    
    searchTitle = null; 
    constructor() { } 
    
    ngOnInit() { } 
    
    changeValue(category: string): void { 
      
      for(let element of this.bookCaterory ) { 
        
        if(element.value == category) { 
          
          this.displayCategoryName = element.viewValue; 
          
        } 
      }
    } 
    
    changeTitleBar(searchInfo) : void {
      this.searchTitle = `${searchInfo.keyword} ( ${searchInfo.category} )`;
    } } 

  @ViewChild(SearchBoxComponent) searchComp: SearchBoxComponent; 
  @ViewChildren(SearchBoxComponent) searchCompArr: QueryList<SearchBoxComponent>; 
  
  clearCondition(): void { this.selectedValue = null; this.searchTitle = null; 
    
    /* 
    
    @ViewChild를 사용할 경우 
    this.searchComp._bookCategory = null; 
    this.searchComp.keyword = null;
     
     */ 

  // @ViewChildren을 사용할 경우 
  this.searchCompArr.toArray()[0]._bookCategory = null; 
  this.searchCompArr.toArray()[0].keyword = null; 
  
  }
}

 

https://www.saichoiblog.com/spice9784/

최신글