2017-08-28 16 views
2

ViewChildを使用してコンポーネントのDOMにアクセスしたいとします。しかし、nativeElementプロパティにアクセスしようとすると、undefinedになります。角度:ViewChildでnativeElementが未定義

以下はスニペットです。

import { Component, ViewChild, AfterViewInit } from '@angular/core'; 
import { AlertComponent } from './alert.component'; 

@Component({ 
    selector: 'app-root', 
    template: ` 
    <app-alert #alert>My alert</app-alert> 
     <button (click)="showAlert()">Show Alert</button>` 
}) 
export class AppComponent implements AfterViewInit { 
    @ViewChild('alert') alert; 

    showAlert() { 
    console.log('alert (showalert)', this.alert.nativeElement); 
    this.alert.show(); 
    } 

    ngAfterViewInit() { 
    console.log('alert (afterviewinit)', this.alert.nativeElement); 
    } 
} 

plunkをご覧ください。

答えて

7

あなたは、コンポーネントをホストするか、あなたがあなたの代わりにコンポーネントまたはディレクティブ

@ViewChild('alert', { read: ElementRef }) alert:ElementRef; 

も参照してくださいangular 2/typescript : get hold of an element in the template

の要素をしたいことを指定する必要がありますディレクティブ要素の参照を取得したい場合

あなたのケースでは、show()メソッドにアクセスできるようにコンポーネント参照用に2種類、DOM属性にアクセスできるように2種類必要です。

Plunker example

+0

ありがとうございます!デフォルトではコンポーネントインスタンスを返します。コンポーネントインスタンスを返すために 'read'プロパティを明示的に指定するにはどうしたらいいですか?また、あなたが私が別の目的のために設定できる他の値が何であるかを知ることができれば幸いです。 – karthikaruna

+1

これはプレーンなHTML要素の場合、デフォルトは 'ElementRef'です。コンポーネントまたはディレクティブをホストする場合、デフォルトでコンポーネントインスタンスが取得されます。 '@ViewChild( 'alert'、{read:AlertComponent})のような特定のコンポーネントを要求するために、コンポーネントまたはディレクティブの型名を使うことができます。alert:AlertComponent;' –