如何通过单击按钮切换垫子扩展面板?

How to toggle mat-expansion-panel with button click?

提问人:physicsboy 提问时间:2/12/2018 最后编辑:isherwoodphysicsboy 更新时间:8/17/2021 访问量:75338

问:

有什么方法可以通过单击外部按钮来扩展特定的垫子扩展面板?

我尝试链接到面板的 ID,但没有成功......

<mat-expansion-panel id="panel1"> ... </>
...
<button (click)="document.getElementById('panel1').toggle()>Click me</button>

例如,这是我的 stackblitz 代码

我的最终计划是使用此方法在从数组生成的列表中打开不同的面板:<mat-expansion-panel *ngFor=“let d of data”> ...

HTML angular angular-material 角度材料

评论


答:

28赞 Juan 2/12/2018 #1

在您的 html 文件中:

<mat-expansion-panel [expanded]="panelOpenState">

    <mat-expansion-panel-header>
        <mat-panel-title>
            TITLE
        </mat-panel-title>
    </mat-expansion-panel-header>

    <p>BODY</p>
</mat-expansion-panel>

<button mat-raised-button (click)="togglePanel">TOGGLE</button>

在您的 TS 文件中:

panelOpenState: boolean = false;

togglePanel() {
    this.panelOpenState = !this.panelOpenState
}

如果使用 *ngFor 生成扩展面板:

<mat-expansion-panel [expanded]="isOpen" *ngFor="let d of data">
    <mat-expansion-panel-header>
        {{ d.header }}
    </mat-expansion-panel-header>
    <p>{{ d.content }}</p>
</mat-expansion-panel>

<button mat-raised-button (click)="togglePanel">TOGGLE</button>

如果按下该按钮,将打开所有展开的面板 同时。

要仅打开一个带有一个按钮的面板,请为每个元素的数据数组添加一个“expanded”属性,如下所示:

  data = [
    {id:1, header:'HEADER 1', content:'CONTENT 1', expanded: false},
    {id:2, header:'HEADER 2', content:'CONTENT 2', expanded: false},
    {id:3, header:'HEADER 3', content:'CONTENT 3', expanded: false},
    {id:4, header:'HEADER 4', content:'CONTENT 4', expanded: false},
  ]

然后在模板中:

<mat-expansion-panel [(ngModel)]="d.expanded" 
    [expanded]="d.expanded" *ngFor="let d of data" ngDefaultControl>

    <mat-expansion-panel-header>
        <button (click)="toggle(d.expanded)">TOGGLE</button>
        {{ d.header }}
    </mat-expansion-panel-header>
    <p>{{ d.content }}</p>

</mat-expansion-panel>

点击按钮引发的方法:

  toggle(expanded) {
    expanded = !expanded;
  }

评论

1赞 physicsboy 2/12/2018
感谢您的更新 Juan - 有没有简单的方法可以打开特定的面板?想象一下,该按钮位于面板本身的标题中
0赞 Anzil khaN 6/18/2019
@juan,你好。我正在使用带有 *ngFor 的多个面板。但问题是我的触发按钮在面板标题之外。我无法将“expanded”值绑定到按钮。你能帮我吗??
0赞 Juan 6/19/2019
@AnzilkhaN我制作了一个 StackBlitz stackblitz.com/edit/angular-hyfoc1,您可以在其中看到解决方案。我使用了 <mat-expansion-panel> 范围之外的按钮和一个文本字段来按索引指向所需的面板(请记住,索引从 0 开始)。
0赞 AppDreamer 9/6/2019
在示例的第一部分中,如果面板没有为您关闭,请尝试在 HTML 中的变量中添加括号...<mat-expansion-panel [(展开)]=“panelOpenState”> ...为我工作。
22赞 bodpad 8/3/2018 #2
<mat-expansion-panel [disabled]="true"
                     #mep="matExpansionPanel"
                     *ngFor="let foo of list">
  <mat-expansion-panel-header>
      <button (click)="mep.expanded = !mep.expanded">Toggle</button>
  </mat-expansion-panel-header>

  <p>Text</p>

</mat-expansion-panel>

评论

0赞 Ash 8/30/2018
它工作得很好,但如何工作?..你能解释一下吗?
2赞 ibrahimab 10/31/2019
@Ash 工作方式:#mep 意味着将扩展面板实例分配给组件上的变量。这意味着(单击)事件处理程序现在可以使用 mep 与面板进行交互。expanded 的默认值为 false,因此要切换扩展面板,请将反向(使用 “!”)重新分配给该扩展面板上的 expanded 属性。
0赞 lostintranslation 2/29/2020
使用禁用会使整个面板变灰。可能不受欢迎。
5赞 Carl Sorenson 11/10/2018 #3

对 mat-expansion-panel 的 expanded 属性使用双向绑定。以下是 StackBlitz 中的一个示例:

https://stackblitz.com/edit/angular-gtsqg8

<button (click)='xpandStatus=xpandStatus?false:true'>Toggle it</button>
<p>
<mat-expansion-panel [(expanded)]="xpandStatus">
  <mat-expansion-panel-header>
    <mat-panel-title>This an expansion panel</mat-panel-title>
    <mat-panel-description>xpandStatus is {{xpandStatus}}</mat-panel-description>
  </mat-expansion-panel-header>
  Two-way binding on the expanded attribute gives us a way to store and manipulate the expansion status.
</mat-expansion-panel>
</p>

评论

0赞 DaFois 11/10/2018
链接内容肯定包含答案,但最好将内容的相关部分放在帖子中,并将链接仅作为参考。
0赞 Carl Sorenson 11/10/2018
嗨,DaFois。我将html添加到答案帖子文本中。
0赞 Anzil khaN 6/18/2019
@CarlSorenson,如果我有多个面板怎么办?现在它将折叠所有其他面板。你能帮忙吗?
0赞 Mathew 2/1/2019 #4
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<mat-accordion displayMode="flat" multi class="mat-table">
    <section matSort class="mat-elevation-z8 mat-header-row">
        <span class="mat-header-cell" mat-sort-header="vesselName"></span>
        <span class="mat-header-cell" mat-sort-header="vesselName">d</span>
    </section>

    <mat-expansion-panel [disabled]="true" #mep="matExpansionPanel"
                         *ngFor="let d of data">
        <mat-expansion-panel-header>
            <span class="mat-cell" (click)="mep.expanded = !mep.expanded">
                <mat-icon class="icon" *ngIf="!mep.expanded">expand_more</mat-icon>
                <mat-icon class="icon" *ngIf="mep.expanded">expand_less</mat-icon>
            </span>
            <span (click)="dClicked(d)" class="mat-cell">{{d.dataSet}}</span>
        </mat-expansion-panel-header>
        <div><pre>{{d | json}}</pre></div>
    </mat-expansion-panel>
    <div class="well" *ngIf="!d || d.length == 0">
        <p>There are no d for this.</p>
    </div>
</mat-accordion>
0赞 Dmitry Grinko 7/25/2019 #5

html格式:

<mat-accordion >
    <mat-expansion-panel #first="matExpansionPanel">
        <mat-expansion-panel-header>
            <mat-panel-title>...</mat-panel-title>
        </mat-expansion-panel-header>
        ...
    </mat-expansion-panel>

    <mat-expansion-panel #second="matExpansionPanel" expanded="true">
        <mat-expansion-panel-header>
            <mat-panel-title>...</mat-panel-title>
        </mat-expansion-panel-header>
        ...
    </mat-expansion-panel>
</mat-accordion>

<button (click)="doSomething(first, second)">Click</button>

TS:

import { Component } from '@angular/core';
import { MatExpansionPanel } from '@angular/material';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html'
})
export class HomeComponent {

  doSomething(first: MatExpansionPanel, second: MatExpansionPanel) {
    if (first.expanded ) {  // check if first panel is expanded
      first.close(); // close first panel
      second.open(); // open second panel
      // ...
    }
  }
}

阅读更多

1赞 Sem 5/9/2020 #6

您可以使用 toggle() 方法。

首先给元素一个 id。

<mat-expansion-panel #matExpansionPanel>

接下来,从 javascript 访问该元素。导入必要的库(MatExpansionPanel、ViewChild)

@ViewChild(MatExpansionPanel, {static: true}) matExpansionPanelElement: MatExpansionPanel;

最后,调用 toggle 函数

this.matExpansionPanelElement.toggle(); //open(), close()

1赞 naveen rulz.. 8/17/2021 #7
<mat-nav-list>
  <mat-expansion-panel *ngFor="let row of rows" #mep="matExpansionPanel">
    <mat-expansion-panel-header>
      {{row}}
    </mat-expansion-panel-header>
   <h2>Test</h2>
    <button (click)="mep.toggle()">Toggle</button>
  </mat-expansion-panel>
</mat-nav-list>

工作示例:https://stackblitz.com/edit/mat-expansion-panel-vymjsq?file=app%2Fexpansion-overview-example.html