【问题标题】:Angular mat-list-item routerLink not workingAngular mat-list-item routerLink 不起作用
【发布时间】:2020-10-27 02:02:53
【问题描述】:

我不明白为什么路由不起作用。任何帮助请...

  1. 当我点击“Terminal 1/2/3”(请查看下图)时,它没有显示 Terminal 页面

  2. 当'AF'折叠时,AF和菜单中的Dashboard之间有很大的差距

代码:github.com/sid-ca/Configurator

https://stackblitz.com/edit/github-1b3qtp-vhyry6

Stackblitz:https://stackblitz.com/github/sid-ca/Configurator

app.module.ts

import { AppRoutingModule } from './app-routing.module';
imports: [
    BrowserModule,
    MatModule,
    AppRoutingModule,

index.html

<base href="/">
<app-root></app-root>

app.component.html

<app-header></app-header>

<mat-sidenav-container>
  <mat-sidenav mode="side" opened="true" style="min-width:60px; background: #F3F3F3;" autosize fixedTopGap="56">
    <app-sidebar></app-sidebar>
  </mat-sidenav>

  <mat-sidenav-content [@onSideNavChange]="sidebarState">
    <router-outlet></router-outlet>
  </mat-sidenav-content>
</mat-sidenav-container>

app-routing.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { DashboardComponent } from './dashboard/dashboard.component';
import { TerminalComponent } from './af/terminal/terminal.component';

const routes: Routes = [
  { path: '', redirectTo: '/dashboard', pathMatch: 'full' },
  { path: 'dashboard', component: DashboardComponent },
  { path: 'terminal', component: TerminalComponent }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

sidebar.component.html

<div class="sidebar_menu" [@onSideNavChange]="sidebarState">
  <mat-nav-list class="menu-list">
    <mat-list-item (click)="showSubmenu = !showSubmenu" class="parent" routerLinkActive="active-list-item" routerLink="login" title="af">
      <mat-icon class="icon menu-icon" style="font-size: 1em !important;" [@iconAnimation]="sidebarState">input</mat-icon>
      <mat-icon class="menu-button" [ngClass]="{'rotated' : showSubmenu}" *ngIf="isExpanded || isShowing">expand_more</mat-icon>
      <span class="label" [@labelAnimation]="sidebarState">AF</span>
    </mat-list-item>
    <div class="submenu" [ngClass]="{'expanded' : showSubmenu}" *ngIf="isShowing || isExpanded">
        <a mat-list-item [routerLink]="'terminal'">Terminal 1</a>
        <a mat-list-item routerLink="terminal" routerLinkActive="active">Terminal 2</a>
        <a  routerLink="terminal"> <mat-list-item> Terminal 3 </mat-list-item></a>

terminal.component.html

<div class="main_container" style=" height:100vh;">
    <p>terminal works!</p>
</div>

【问题讨论】:

  • 那么哪个路由不起作用?
  • > 当我点击“Terminal 1/2/3”时,它确实显示了终端页面,你的意思是这不起作用?
  • @Derek.W - 添加图片,1 号或 2 号或 3 号航站楼(这 3 个子菜单)
  • @WilliamWang - 没错,当我点击终端 1 时,它没有显示 terminal.component.html 中的内容
  • 尝试在routerLink中添加/所以/terminal

标签: angular angular-material


【解决方案1】:

您的代码存在多个问题,这就是它无法按预期工作的原因。

当我点击“Terminal 1/2/3”时(请查看下图) 不显示终端页面

这行不通,因为

  1. 您有错误的链接。路由器链接应显示为您在路由模块中配置的 /terminal
<a mat-list-item routerLink="/terminal">Terminal 1</a>
<a mat-list-item routerLink="/terminal" routerLinkActive="active">Terminal 2</a>
<a routerLink="/terminal"> <mat-list-item> Terminal 3 </mat-list-item></a>
  1. sidebar.module.ts 需要导入 RouterModule 才能使 routerLink 属性起作用。

当'AF'折叠时,AF和菜单中的Dashboard之间有很大的差距

这与您的ngIf 条件有关。您应该在更新 ngIf 的组件文件中为 isShowing 设置正确的值

<div
      class="submenu"
      [ngClass]="{'expanded' : showSubmenu}"
      *ngIf="showSubmenu && (isShowing || isExpanded)">
  ...
</div>

查看更新后的stackblitz

【讨论】:

    【解决方案2】:
    1. 检查控制台以查看是否有任何可能有帮助的错误消息(在单击链接之前和之后)
    2. 直接在浏览器地址栏中输入终端,看看终端页面是否真的有效
    3. 您确实需要在路径前添加/routerLink='/terminal'

    【讨论】:

    • 1.控制台没有错误,2. /terminal 在浏览器中工作,3) 已经尝试 routerLink='/terminal'
    • 那么唯一的可能性似乎是您的链接点击事件有问题!尝试将其中一个的点击绑定到在控制台中记录一些文本并查看它是否有效的函数
    • 这是一个超链接,我不明白在点击事件中要修复什么
    • 我只是想确保您能够点击它!删除 routerLink 并添加 (click)="someFunction()" 以查看它是否触发点击事件。因为它可能被不可见的元素或其他东西覆盖!
    • 它是可点击的,我已经用 github url 更新了我的帖子
    【解决方案3】:

    您需要在您的SidebarModule 中导入RouterModule(来自@angular/router)。否则 Angular 不知道如何处理 routerLink 属性。

    事实上,如果你对 routerLink 使用输入绑定而不是使用它作为静态属性,你会从 Angular 得到一个有用的编译器错误:

    // sidebar.component.html
    <a mat-list-item [routerLink]="'terminal'">Terminal 1</a>
    
    // error triggered
    Template parse errors:
    Can't bind to 'routerLink' since it isn't a known property of 'a'. ("howSubmenu}" 
    

    【讨论】:

      【解决方案4】:

      尝试导入

      import {MatListModule} from '@angular/material/list';
      import { RouterModule, Routes } from '@angular/router';
      

      【讨论】:

        【解决方案5】:

        一般答案: 如果routerLink 不起作用,则应用程序组件中的任何位置

        然后检查其相关的###.module.ts文件并检查RouterModule是否被导入。

        如果没有,则添加import { RouterModule } from '@angular/router';####.module.ts 文件中。

        您的 routerLink 将开始工作!!!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-09
          • 1970-01-01
          • 2016-12-18
          • 2020-01-30
          • 2018-06-06
          • 1970-01-01
          • 2020-05-09
          • 2018-11-25
          相关资源
          最近更新 更多