【问题标题】:How to programmatically expand a mat-expansion-panel, which was added dynamically?如何以编程方式扩展动态添加的垫子扩展面板?
【发布时间】:2019-10-25 05:44:34
【问题描述】:

我正在尝试使用 *ngFor 在 Mat-accordian 中显示多个 Mat-expansion-panel。我需要在单击我能够执行的按钮时添加一个新的 mat-expansion-panel。我还需要在单击按钮时展开(打开)这个新添加的扩展面板,这是我无法实现的。请帮忙。

Stackblitz - https://stackblitz.com/edit/angular-fh5vu1-g6phe6?file=app%2Fexpansion-steps-example.ts

export class ExpansionStepsExample { 
  items: number[] = [1,2,3];

  AddNewRow() {
    this.items.push(4);
  }
}
<mat-accordion class="example-headers-align">
  <mat-expansion-panel *ngFor="let item of items;">
    <mat-expansion-panel-header>
      <mat-panel-title> {{item}} </mat-panel-title>
    </mat-expansion-panel-header>
    {{item}}
  </mat-expansion-panel>
</mat-accordion>
<button (click)="AddNewRow()" value="Add New"> Add New </button>

【问题讨论】:

    标签: angular angular-material


    【解决方案1】:

    您可以访问材质扩展面板元素,并调用方法 open() 和 close()。

    import { Component, OnInit, ViewChild } from '@angular/core';
    import { MatExpansionPanel } from '@angular/material';
    ...
    @ViewChild(MatExpansionPanel, {static: true}) matExpansionPanelElement: MatExpansionPanel;
    ...
    selectItem() {
        this.matExpansionPanelElement.close(); //open()
    }
    <mat-accordion>
        <mat-expansion-panel #matExpansionPanel>
        ...
        </mat-expansion-panel>
    </mat-accordion>

    【讨论】:

    • 在最新的角度材质中,导入更新:import { MatExpansionPanel } from '@angular/material/expansion';
    【解决方案2】:

    我建议您更改数据模型。通过这种方式,您可以存储打开和关闭的状态以及每个项目的数量。

    item = [
      {
        number: 1, 
        open: false
      },
      {
        number: 2,
        open: true
      }
    ];
    
      AddNewRow() {
         this.item.push({number: 3, open: true});
       }
    
    <mat-accordion class="example-headers-align" multi="true">
       <mat-expansion-panel *ngFor="let item of items;" [expanded]="item.open" >
          <mat-expansion-panel-header>
             <mat-panel-title> {{item. number}} </mat-panel-title>
          </mat-expansion-panel-header>
             {{item.number }}
       </mat-expansion-panel>
    </mat-accordion>
    <button (click)="AddNewRow()" value="Add New"> Add New </button>
    

    【讨论】:

      【解决方案3】:

      @sem 对答案的小改动 对于 Angular 9+ 使用: 组件.ts

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

      component.html

      <mat-expansion-panel #matExpansionPanel>
      

      【讨论】:

        猜你喜欢
        • 2019-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-01
        • 2021-05-03
        • 2021-01-03
        • 2019-01-12
        • 2018-04-25
        相关资源
        最近更新 更多