2017-06-01 60 views
2

Note: since the problem is a little complex, the code is abstracted for readability無法獲取子DOM元素的保持

我們一個<parent-component>這樣的:

<child-component></child-component> 
<button (click)="doSomeClick()"> Do Some Click </button> 

的的<child-component>template是:

<textarea #childComponentElement #someField="ngModel" name="someName" [(ngModel)]="someModel"></textarea> 

我們試圖訪問這個元素在parent-component.component.ts裏面的值如下:

export class ParentComponent implements AfterViewInit { 
    @ViewChild('childComponentElement') el:ElementRef; 

    ngAfterViewInit() { 
     console.log(this.el.nativeElement.value); 
    } 
    doSomeClick(){ 

    } 
} 

但是它拋出這個錯誤:

​​

我們用什麼到目前爲止已經試過:

+0

您是否嘗試過以下方法:https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#afterview? – Edwin

+1

@Edwin'ngAfterViewInit'在這個用法中是正確的。只是他試圖從模板不屬於的父組件訪問templateRef。 – borislemke

回答

4

有沒有簡單的方法來此與嵌套的組件,你必須創建一個EventEmitter發出的ElementRef您嘗試訪問的元素:

child.component.ts

class ChildComponent implements AfterViewInit { 

    @Output() 
    templateLoaded: EventEmitter<ElementRef> = new EventEmitter() 

    @ViewChild('childComponentElement') el: ElementRef 

    ngAfterViewInit(): void { 
     this.templateLoaded.emit(this.el) 
    } 
} 

parent.component.html

<child-component (templateLoaded)="templateLoaded($event)" 

parent.component。TS

class ParentComponent { 

    templateLoaded(template: ElementRef): void { 
     // do stuff with the `template` 
    } 
} 

原來的答案

嘗試使用。如果你想知道的第二個參數ViewChild

@ViewChild('childComponentElement', {read: ElementRef}) el: ElementRef 

第二個參數的read屬性,這個答案給出了一個很好說明:What is the read parameter in @ViewChild for

+0

使用'read'屬性後,'this.el'仍然未定義。 – xameeramir

+1

@xameeramir啊,你是否試圖從父組件沒有那個html作爲模板訪問'ElementRef'? – borislemke

+0

是的,我們從'parent-component.component.ts'訪問''的'