2017-01-10 18 views
4

親コンポーネント(toggleSidebar())の子コンポーネントの要素(#sidenav)にアクセスしたいとします。私は成功せず、このソリューションを適用しようとしました:angular 2/typescript: get hold of an element in the template親コンポーネント内の子コンポーネントの要素への参照の取得

私の子コンポーネント:

import { Component, OnInit } from '@angular/core'; 

@Component({ 
    selector: 'app-sidebar', 
    template: ` 
    <md-sidenav #sidenav mode="side" class="app-sidenav"> 
    Sidenav 
    </md-sidenav> 
    `, 
    styleUrls: ['./sidebar.component.css'] 
}) 
export class SidebarComponent implements OnInit { 

    constructor() { } 

    ngOnInit() { 
    } 

} 

私の親コンポーネント:

import { SidebarComponent } from './sidebar/sidebar.component'; 
import { Component, ViewChild } from '@angular/core'; 

@Component({ 
    selector: 'app-root', 
    template: ` 
    <app-sidebar></app-sidebar> 
    <app-toolbar (toggleSidebar)="toggleSidebar()"></app-toolbar> 
    `, 
    styleUrls: ['./app.component.css'] 
}) 
export class AppComponent { 

    @ViewChild('sidenav') sidebar: SidebarComponent; 

    constructor() { } 

    toggleSidebar() { 
    this.sidebar.toggle(); 
    } 
} 
+0

親コンポーネントでsidenavは何ですか? – echonax

+0

あなたは ''を試しましたか? – yurzui

+0

@yurzuiはい、うまくいきません – Gabriel

答えて

7

あなたは

で親から子コンポーネントを取得する必要があります
@ViewChild(SidebarComponent) sidebar: SidebarComponent; 

sidenav

を削除し、子要素に追加してその要素を取得します。

@ViewChild('sidenav') sidenav; 

は最終的にあなたがやりたいために親から自分の子コンポーネントsidenavフィールドを呼び出します。

this.sidebar.sidenav// <-- selects child components element

import { SidebarComponent } from './sidebar/sidebar.component'; 
import { Component, ViewChild } from '@angular/core'; 

@Component({ 
    selector: 'app-root', 
    template: ` 
    <app-sidebar></app-sidebar> 
    <app-toolbar (toggleSidebar)="toggleSidebar()"></app-toolbar> 
    `, 
    styleUrls: ['./app.component.css'] 
}) 
export class AppComponent { 

    @ViewChild(SidebarComponent) sidebar: SidebarComponent; 

    constructor() { } 

    toggleSidebar() { 
    this.sidebar.sidenav.toggle(); 
    } 
} 

子:

import { Component, OnInit } from '@angular/core'; 

@Component({ 
    selector: 'app-sidebar', 
    template: ` 
    <md-sidenav #sidenav mode="side" class="app-sidenav"> 
    Sidenav 
    </md-sidenav> 
    `, 
    styleUrls: ['./sidebar.component.css'] 
}) 
export class SidebarComponent implements OnInit { 
    @ViewChild('sidenav') sidenav; 
    constructor() { } 

    ngOnInit() { 
    } 

} 
+0

素晴らしい、それは動作します。ありがとうございました! – Gabriel

+0

@Gabrielうれしいよ:-) – echonax

+1

これは ' – yurzui

関連する問題