【问题标题】:How to toggle mat-expansion-panel with button click?如何通过单击按钮来切换 mat-expansion-panel?
【发布时间】:2018-07-22 13:13:33
【问题描述】:

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

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

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

Here is my stackblitz code for example

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

【问题讨论】:

    标签: html angular angular-material


    【解决方案1】:
    <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

    【讨论】:

      【解决方案2】:

      你可以使用toggle()方法。

      首先给元素一个id。

      &lt;mat-expansion-panel #matExpansionPanel&gt;

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

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

      最后,调用切换函数

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

      【讨论】:

        【解决方案3】:

        在您的 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>
        

        如果您按下按钮,所有展开的面板都会打开 同时。

        要使用一个按钮只打开一个面板,请为每个元素的数据数组添加一个“扩展”属性,如下所示:

          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;
          }
        

        【讨论】:

        • 感谢您的更新 Juan - 有没有打开特定面板的简单方法?想象一下按钮在面板本身的标题中
        • @juan,你好。我正在使用带有 *ngFor 的多个面板。但问题是我的触发按钮在面板标题之外。我无法将“扩展”值绑定到按钮。你能帮我吗??
        • @AnzilkhaN 我创建了一个 StackBlitz stackblitz.com/edit/angular-hyfoc1,您可以在其中看到解决方案。我使用了 范围之外的按钮和一个文本字段按索引指向所需的面板(请记住,索引从 0 开始)。
        • 在示例的第一部分中,如果面板没有为您关闭,请尝试在 HTML 中的变量中添加括号... ...为我工作。
        【解决方案4】:

        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
              // ...
            }
          }
        }
        

        Read more

        【讨论】:

          【解决方案5】:
          <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>
          

          【讨论】:

            【解决方案6】:

            在 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>
            

            【讨论】:

            • 链接内容肯定包含答案,但最好将内容的相关部分放在帖子中,并将链接留作参考。
            • 嗨,达福斯。我将 html 添加到答案帖子文本中。
            • @CarlSorenson,如果我有多个面板呢?现在它将折叠所有其他面板。你能帮忙吗??
            【解决方案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>
            

            【讨论】:

            • 它工作得很好,但是怎么样?..你能解释一下吗。
            • @Ash 它的工作方式:#mep 意味着,将扩展面板实例分配给组件上的变量。这意味着(单击)事件处理程序现在可以使用 mep 与面板交互。 expand 的默认值为 false,因此要切换扩展面板,您需要将逆向(使用“!”)重新分配给该扩展面板上的扩展属性。
            • 使用禁用会使整个面板变灰。可能不需要。
            猜你喜欢
            • 2019-10-26
            • 1970-01-01
            • 1970-01-01
            • 2018-08-28
            • 2019-07-14
            • 1970-01-01
            • 1970-01-01
            • 2011-05-11
            • 1970-01-01
            相关资源
            最近更新 更多