提问人:physicsboy 提问时间:2/12/2018 最后编辑:isherwoodphysicsboy 更新时间:8/17/2021 访问量:75338
如何通过单击按钮切换垫子扩展面板?
How to toggle mat-expansion-panel with button click?
问:
有什么方法可以通过单击外部按钮来扩展特定的垫子扩展面板?
我尝试链接到面板的 ID,但没有成功......
<mat-expansion-panel id="panel1"> ... </>
...
<button (click)="document.getElementById('panel1').toggle()>Click me</button>
我的最终计划是使用此方法在从数组生成的列表中打开不同的面板:<mat-expansion-panel *ngFor=“let d of data”> ...
答:
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
评论