Reputation: 3236
I want to access the DOM of a component using ViewChild
. But when I try to access the nativeElement
property, it's undefined
.
Below is the snippet.
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);
}
}
Please take a look at the plunk.
Upvotes: 73
Views: 59546
Reputation: 657058
If you want to get a reference of an element that hosts a component or directive you need to specify that you want the element instead of the component or directive
@ViewChild('alert', { read: ElementRef }) alert:ElementRef;
See also angular 2 / typescript : get hold of an element in the template
In your case I guess you need two different @ViewChild()
one for the component reference to be able to access the show()
method, and a 2nd one to be able to access DOM attributes.
Upvotes: 170