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

phy*_*boy 6 html angular-material angular

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

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

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

这是我的stackblitz代码

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

Jua*_*uan 13

在你的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>
Run Code Online (Sandbox Code Playgroud)

在您的TS文件中:

panelOpenState: boolean = false;

togglePanel() {
    this.panelOpenState = !this.panelOpenState
}
Run Code Online (Sandbox Code Playgroud)

如果使用*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>
Run Code Online (Sandbox Code Playgroud)

如果按下按钮,则所有展开的面板同时打开.

要使用一个按钮只打开一个面板,请为每个元素添加一个"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},
  ]
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中:

<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>
Run Code Online (Sandbox Code Playgroud)

按下按钮点击的方法:

  toggle(expanded) {
    expanded = !expanded;
  }
Run Code Online (Sandbox Code Playgroud)


小智 7

<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>
Run Code Online (Sandbox Code Playgroud)

  • @Ash 它的工作方式:#mep 意味着将扩展面板实例分配给组件上的变量。这意味着(单击)事件处理程序现在可以使用 mep 与面板交互。Expanded 的默认值为 false,因此要切换扩展面板,您可以将逆值(使用“!”)重新分配给该扩展面板上的 Expanded 属性。 (2认同)

Car*_*son 5

在mat-expansion-panel的扩展属性上使用双向绑定。这是 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>
Run Code Online (Sandbox Code Playgroud)