2016-08-11 25 views
0

我試圖從父組件中獲取子元素與@ViewChild,但我有一個問題,因爲我的子組件必須從父函數啓動。在這樣的事情之後,我不能找到一個孩子。它工作正常,當子組件開始ngOnInit或任何,但不能與我的功能一起工作......我做錯了什麼,以及如何讓它工作?無法從父組件獲取子元素

我的父母比較:

export class MainScreenComponent { 

    @ViewChild('myChild') child; 
    showMyChild = false; 

    getMyChild() { 
     this.showMyChild = true; 
     console.log(this.child.mytest); //undefined 
    } 

} 

我的父母溫度:

<button (click)="getMyChild()">Start My Child Comp</button> 
<hr> 
<div *ngIf="showMyChild==true"> 
    <div my-child #myChild></div> 
</div> 

我的孩子比較:

@Component({ 
    selector: '[my-child]' 
}) 

export class StdOrderComponent { 
    mytest = 'This goes to parent'; 
} 

回答

1

你varibale到子組件未初始化,因爲<div my-child #myChild></div>不DOM時showMyChild = false

我知道2級的解決方案:

  1. 使用[hidden],而不是*ngIf,所以元素是永遠存在的,而是隱藏
<div [hidden]="showMyChild"> 
    <div my-child #myChild></div> 
</div> 
  • 手柄AfterViewhttps://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#afterview (我可能錯誤地描述了確切的生命週期鉤子),以便捕獲將子組件添加到DOM的時刻。
  • P.S.你並不需要一個boolean變量比較true

    *ngIf="showMyChild==true"是一樣的* ngIf =「showMyChild」

    +0

    安德烈,感謝您的快速回復! '[hidden]'不能在這裏應用,因爲'my-child'會在init初始化一個大的粗體數據的'POST'請求。所以'ngAfterViewChecked'是正確的想法。謝謝。但之後,我明白,我實際上需要一個'@輸出'爲我的目的%) –