【问题标题】:Getting a reference to the child component's element in the parent component在父组件中获取对子组件元素的引用
【发布时间】:2017-05-25 09:04:24
【问题描述】:

我想在父组件 (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();
  }
}

【问题讨论】:

  • 父组件中的sidenav是什么?
  • 你试过&lt;app-sidebar #sidenav&gt;&lt;/app-sidebar&gt;吗?
  • @yurzui 是的,但它不起作用
  • 也许它不起作用,因为您试图在 md-sidenav 上调用方法?

标签: angular components


【解决方案1】:

Angular 8 更新:

@ViewChild(SidebarComponent, {static: false}) sidebar: SidebarComponent;

更多信息请查看:https://angular.io/guide/static-query-migration


您应该使用

从父组件获取子组件
@ViewChild(SidebarComponent) sidebar: SidebarComponent;

所以删除sidenav

并将其添加到子组件以获取该元素。

@ViewChild('sidenav') sidenav;

最后从父级调用你的子组件sidenav 字段来做你想做的任何事情。

this.sidebar.sidenav// &lt;-- 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() {
  }

}

【讨论】:

  • @Gabriel 很高兴我能帮上忙 :-)
  • 似乎这也应该工作&lt;app-sidebar #sidebar&gt;&lt;/app-sidebar&gt;&lt;app-toolbar (toggleSidebar)="sidebar.sidenav.toggle()"&gt;&lt;/app-toolbar&gt;
猜你喜欢
  • 1970-01-01
  • 2016-07-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 2017-05-07
  • 2018-08-13
  • 1970-01-01
相关资源
最近更新 更多