【问题标题】:how to close a mat-accordion when other mat-accordion is opened?打开其他垫子手风琴时如何关闭垫子手风琴?
【发布时间】:2022-02-23 17:38:21
【问题描述】:

我将 Angular Material 与 Angular v6 一起使用。我有两个手风琴,每个手风琴都包含一个扩展面板。当我打开另一个手风琴时,如何关闭打开的手风琴?现在两个手风琴都保持开放!

代码:

<!-- first accordion -->
<mat-accordion>
    <mat-expansion-panel mat-list-item *ngIf="menuitem.type === 'sub'">
      <mat-expansion-panel-header class="main-header">
        <mat-panel-title>
          <mat-icon class="list-icon">{{ menuitem.icon }}</mat-icon>
          <span class="name">{{ menuitem.name }}</span>
        </mat-panel-title>
      </mat-expansion-panel-header>

      <mat-nav-list *ngFor="let child of menuitem.children" routerLinkActive="open">
        <a class="grand-menu" mat-list-item href="javascript:;" *ngIf="child.type === 'x'" [routerLink]="['/', menuitem.state, child.state ]">
          <span class="grand">{{ child.name }}</span>
        </a>
      </mat-nav-list>

      <mat-accordion open>
        <mat-expansion-panel mat-list-item *ngFor="let childitem of menuitem.children" routerLinkActive="open" #example>
          <mat-expansion-panel-header class="child" *ngIf="childitem.grand_children">
            <mat-panel-title class="child-title">
              <mat-icon class="arrow-icon" *ngIf="!example.expanded">keyboard_arrow_right</mat-icon>
              <mat-icon *ngIf="example.expanded">keyboard_arrow_down</mat-icon>
              {{ childitem.name }}
            </mat-panel-title>
          </mat-expansion-panel-header>

          <mat-nav-list *ngFor="let child of childitem.grand_children" routerLinkActive="open">
            <a class="grand-menu" mat-list-item href="javascript:;" *ngIf="childitem.type === 'parent'" [routerLink]="['/', menuitem.state, childitem.state, child.state ]">
              <span class="grand">{{ child.name }}</span>
            </a>
          </mat-nav-list>
        </mat-expansion-panel>
      </mat-accordion>
    </mat-expansion-panel>
  </mat-accordion>

   <!-- second accordion -->
  <mat-accordion>
      <mat-expansion-panel mat-list-item *ngIf="menuitem.type === 'sub1'">
        <mat-expansion-panel-header class="main-header">
          <mat-panel-title>
            <mat-icon class="list-icon">{{ menuitem.icon }}</mat-icon>
            <span class="name">{{ menuitem.name }}</span>
          </mat-panel-title>
        </mat-expansion-panel-header>

        <mat-nav-list *ngFor="let child of menuitem.children" routerLinkActive="open">
          <a class="grand-menu" mat-list-item href="javascript:;" *ngIf="child.type === 'x'" [routerLink]="['/', menuitem.state, child.state ]">
            <span class="grand">{{ child.name }}</span>
          </a>
        </mat-nav-list>
      </mat-expansion-panel>
    </mat-accordion>

【问题讨论】:

  • 你为什么要使用列表项和手风琴的组合?
  • @Edric 我有两个按钮,它们是手风琴手风琴,每个手风琴都有一些子菜单,每个子菜单都有一些子菜单

标签: angular typescript angular-material


【解决方案1】:

使用 mat-expansion-panel 提供的打开和关闭事件。

<mat-expansion-panel (closed)="isOpen = false" (opened)="isOpen = true">
  [...]
</mat-expansion-panel>

在您的班级中创建一个公共变量,例如已打开:

export class YourClass {
  isOpen: boolean;
}

然后将isOpen 作为@Input() 传递给另一个mat-expansion-panel

<mat-expansion-panel [expanded]="isOpen">
</mat-expansion-panel>

为了让每个手风琴都能听到另一个手风琴,你必须在两个方向上实现这一点。

【讨论】:

    【解决方案2】:

    您可以在循环时使用索引,在不循环 mat-expansion-panel 时使用整数。

    <mat-accordion [togglePosition]="'before'" multi>
    <mat-expansion-panel [expanded]="state === 0" (opened)="setState(0)">
        <mat-expansion-panel-header>
            <mat-panel-title>
                <p class="mt-4">Title 1</p>
            </mat-panel-title>
        </mat-expansion-panel-header>
        <app-upload></app-upload>
    </mat-expansion-panel>
    <br>
    <mat-expansion-panel [expanded]="state === 1" (opened)="setState(1)">
        <mat-expansion-panel-header>
            <mat-panel-title>
                <p class="mt-4">Title 2</p>
            </mat-panel-title>
        </mat-expansion-panel-header>
        <app-upload></app-upload>
    </mat-expansion-panel>
    

    在ts文件中:

    step: number = -1; // -1 makes all the accordians to be closed. Can replace 0 with -1 to open the required accordion open on page load.
    
    setState(stateNumb: number) {
      this.state = stateNumb;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-13
      • 2017-10-26
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 2021-02-05
      相关资源
      最近更新 更多