【问题标题】:Angular 5 Material mat-sidenav 切换不起作用
【发布时间】:2018-11-21 01:39:34
【问题描述】:

我正在尝试使用官方open/close example 让 sidenav 工作。

我是 Angular 的新手,所以我不确定一切应该如何工作,但对于其他组件,到目前为止,我已经很好地抓住了示例的 HTML 部分并修改了 CSS。

经过反复试验,我发现 ma​​t-sidenav-content 不是 sidenav 的内容,而是页面/网站内容。

为了进行实验并让某些东西发挥作用,我现在在我的 app.component.html 中采用了这种方式(一旦我弄清楚这一点,以后可能会进入指令/组件) :

<mat-sidenav-container class="all-wrap" fullscreen>
  <mat-sidenav #sidenav mode="side" opened>
  yo
  </mat-sidenav>


<mat-sidenav-content>

<app-top-nav></app-top-nav>
<router-outlet></router-outlet>
     
<app-footer-nav></app-footer-nav>
    </mat-sidenav-content></mat-sidenav-container>

该示例在 ma​​t-sidenav 上使用 [(opened)]="opened"。这只是让导航对我关闭,只需使用 open 就可以打开它。无论哪种方式,开关都坏了。切换开关在 topnav.html 中:

<div class="pageFullNav">
  <nav class="docs-navbar">
      
        <a mat-button (click)="sidenav.toggle()"><i class="material-icons">menu</i></a>   

... etc />

控制台在切换时失败。

TopNavComponent.html:5 ERROR TypeError: Cannot read property 'toggle' of undefined
    at Object.eval [as handleEvent] (TopNavComponent.html:5)
    at handleEvent (core.js:13589)
    at callWithDebugContext (core.js:15098)
    at Object.debugHandleEvent [as handleEvent] (core.js:14685)
    at dispatchEvent (core.js:10004)
    at eval (core.js:10629)
    at HTMLAnchorElement.eval (platform-browser.js:2628)
    at ZoneDelegate.invokeTask (zone.js:421)
    at Object.onInvokeTask (core.js:4751)
    at ZoneDelegate.invokeTask (zone.js:420)

我相信这可能与缺少 Material 模块有关,但据我所知,我拥有所有相关的模块。

import { NgModule } from '@angular/core';
import {MatButtonModule, MatCheckboxModule, MatInputModule, MatMenuModule, MatSidenavModule, MatButtonToggleModule, MatExpansionModule, MatRippleModule} from '@angular/material';

// add only required modules


@NgModule({
  imports: [MatButtonModule, MatCheckboxModule, MatInputModule, MatMenuModule, MatSidenavModule, MatButtonToggleModule, MatExpansionModule, MatRippleModule],
  exports: [MatButtonModule, MatCheckboxModule, MatInputModule, MatMenuModule, MatSidenavModule, MatButtonToggleModule, MatExpansionModule, MatRippleModule]
})
export class CustomMaterialModule { }

如果有任何关于要修改哪些文件/部分的帮助非常明确,我将不胜感激,因为这种环境对我来说相对较新。谢谢!

【问题讨论】:

  • 您似乎在 app.component.html 中声明了模板变量 sidenav,然后尝试在 topnav.html 中使用它。这是行不通的,因为模板变量的作用域是声明它们的模板,所以当在你的组件中查找 sidenav 并且没有找到任何东西时,它会抛出该错误。
  • 你说得对,谢谢。我认为可能存在范围问题,但不知道文件是如何一起提供的。谢谢!

标签: angular5 toggle angular-material2 mat-sidenav


【解决方案1】:

由上述p4r1 解决。再次感谢。

解决方案是将切换控件移动到与 side-nav 相同的文件中。

<mat-sidenav-container class="all-wrap" fullscreen>
  <mat-sidenav #sidenav mode="side" opened>
  <h3>navigate</h3>
  </mat-sidenav>


<mat-sidenav-content>
    <a mat-button (click)="sidenav.toggle()"><i class="material-icons">menu</i></a>

【讨论】:

  • 但我遇到了问题。我正在使用 EventEmitter 从另一个组件调用 sidenav.toggle()。引用此代码Angular Material: toolbar and sidenav。这适用于该教程,但不适用于我的代码。把事情说清楚。我在创建事件发射器对象的三个文件 1 '.ts' 中进行了更改。 **2。 'Header bar html' 的关联 html 文件。 3.使用我创建的事件编辑器对象调用我的导航菜单、路由器模板和此标题栏的导航页面。
猜你喜欢
  • 1970-01-01
  • 2022-11-10
  • 2019-03-26
  • 2019-05-16
  • 2018-12-16
  • 2018-12-08
  • 2019-04-04
  • 2019-11-29
  • 2016-10-26
相关资源
最近更新 更多