Angular 2 : Toggle sidenav from different Component

标签 angular material-design angular2-services

我有一个侧导航,我想从不同的组件打开它。我为此创建了一个服务,因为它不是父/子关系,但我不断将导航返回为未定义。我做错了什么?

这是服务:

import {Injectable} from '@angular/core';
import {MdSidenav, MdSidenavToggleResult} from "@angular/material";

@Injectable()
export class SidenavService {
  private sidenav: MdSidenav;

  public setSidenav(sidenav: MdSidenav) {
    this.sidenav = sidenav;
  }

  public open(): Promise<MdSidenavToggleResult> {
    return this.sidenav.open();
  }

  public toggle(isOpen?: boolean): Promise<MdSidenavToggleResult> {
    return this.sidenav.toggle(isOpen);
  }
  constructor() {
  }
}

这是带有 sidenav 的 InstellingenComponent 的 html(我删除了一些内容,因此更具可读性):

<md-sidenav #sidenav align="end" mode="side" opened="true">
  <div>
    <h3>Weergave aanpasssen</h3>
    <section class="instellingen">
             <h3>Kleuren</h3>
      </form>
    </section>
  </div>
  </md-sidenav>

在另一个组件中我有:

export class AppComponent implements OnInit {

  constructor(private sidenavService: SidenavService) {
  }

  ngOnInit(): void {
      }

  public toggleSidenav() {
    this.sidenavService
      .toggle()
      .then(() => {
      });
  } }

和以下 html:

    <button md-icon-button (click)="toggleSidenav()" class="button">
<md-icon>settings</md-icon></button>

最佳答案

您需要在 sidenav 服务中设置对 sidenav 的引用,以便该服务可以打开/关闭 sidenav。否则,它将始终是未定义

为此,请打开 InstellingenComponent.ts 文件(其模板具有侧面导航组件的组件),并进行以下更改:

添加此行代码以获取对模板中侧面导航组件的引用(最好将其添加到顶部,就在 export class InstellingenComponent 语句下方)
@ViewChild('sidenav') public sidenav: MdSidenav;

在构造函数中,如下所示注入(inject) SidenavService (注意,将其添加到您可能已有的构造函数中)

  public constructor(
    private sidenavService: SidenavService
  )

确保该类实现 OnInit,如下所示。
导出类 InstellingenComponent 实现 OnInit

最后,在您的 ngOnInit() 函数中(如果尚不存在,则添加新函数),设置对 sidenav 的引用,如下所示:

  public ngOnInit(): void {
    this.sidenavService
      .setSidenav(this.sidenav);
  }

关于 Angular 2 : Toggle sidenav from different Component,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44476752/

相关文章:

android - 下拉按钮/微调器,就像谷歌设计规范中的那些

node.js - 如何以正确的方式从response.body中获取数据?

javascript - Angular 2 中针对每个请求的自定义 Http header

angular - Observables 以及如何在 Angular2 中正确使用它们

javascript - 如何在innerHTML Angular 2中绑定(bind)点击事件/函数?

angular - 如何在 Material 表 Angular 5 中创建自定义箭头

angular - 使用数据 bool 值展开/折叠 Material 树(Angular 7)

angular - 我需要通过路由器导出激活方法在路由器导出中获取组件名称

javascript - JS中如何检测MDC Snackbar是否关闭?

jquery - 当选项卡数量多于容器宽度可容纳且不滚动时,如何使 MaterializeCSS 选项卡可滚动