如何更改垫扩展面板的切换图标?

Sam*_*lam 9 javascript typescript angular-material angular angular-material-7

切换 a 的默认图标mat-expansion-panel>。设置hideToggletrue 只是隐藏切换图标。有什么办法可以改变它吗?我在官方文档中什么也没找到。如果状态分别是关闭或打开,我想使用+-图标。

wen*_*jun 9

正如 Angular Material Expansion Panel文档中所述,我们可以自定义 的样式mat-extension-panel-header,从而允许您自定义图标。

首先,您可以通过将hideToggle属性设置为 false 来隐藏原始图标。此外,我们指定事件绑定(opened),并(closed)panelOpenState财产。可以签出的其他属性mat-expansion-panel这里

<mat-expansion-panel (opened)="panelOpenState = true" (closed)="panelOpenState = false"hideToggle="true">
Run Code Online (Sandbox Code Playgroud)

接下来,在您的 上mat-panel-description,包含所需的自定义图标。显示的图标将取决于面板的状态。在这个例子中,我们使用Material Icons 中的图标

<mat-panel-description>
  <mat-icon *ngIf="!panelOpenState">add</mat-icon>
  <mat-icon *ngIf="panelOpenState">remove</mat-icon>
</mat-panel-description> 
Run Code Online (Sandbox Code Playgroud)

我已经编辑了 Angular 文档中的原始示例,因此它使用自定义+minus图标来表示mat-extension-panel. 您可以在此处访问演示。

  • 另一个调整是,如果您使用模板引用,则不需要 `panelOpenState` 属性:`&lt;mat-expansion-panel #panel "hideToggle="true"&gt;` 和 `&lt;mat-panel-description&gt;&lt;mat- icon *ngIf="!panel.expanded"&gt;添加&lt;/mat-icon&gt;&lt;mat-icon *ngIf="panel.expanded"&gt;删除&lt;/mat-icon&gt;&lt;/mat-panel-description&gt;`。通过定义`panel` 作为模板引用,您可以直接访问 mat-expansion-panel 的 `expanded` 状态,从而无需在组件中使用变量。 (4认同)
  • 该解决方案适用于一个垫子扩展面板。如果我有多个扩展面板怎么办?`panelOpenState` 是一个由每个扩展面板共享的变量。一个面板展开,所有图标从 + 变为 0,因为每个展开面板共享相同的变量“panelOpenState”。我想了一个解决方案:给每个面板一个硬编码的 id(如 panel1、panel2 等)并使用 `opened` 和 `closed` 事件我可以更改 `&lt;mat-icon&gt;` 标签中的值。但我认为这是一个非常乏味的想法。必须有比硬编码解决方案更好的通用方法。 (3认同)
  • 除了 @samiul-alam 描述的限制之外,我还发现这种方法的另一个问题:它不适用于 `togglePosition="before"` (2认同)

v-a*_*rew 7

有一个类.mat-expanded适用于<mat-expansion-panel>

所以你可以只使用 CSS 来改变图标,不需要 JS。

  • 要将向下箭头更改为向上箭头:
.mat-expanded .mat-expansion-panel-header-title .material-icons{
  transform: rotate(180deg);
}
Run Code Online (Sandbox Code Playgroud)
    <mat-panel-title>
      <span class="material-icons">expand_more</span>
      Panel with icon `transform`
    </mat-panel-title>
Run Code Online (Sandbox Code Playgroud)
  • 交换图标:
    <mat-panel-title>
      <span class="material-icons">expand_more</span>
      Panel with icon `transform`
    </mat-panel-title>
Run Code Online (Sandbox Code Playgroud)
    <mat-panel-title>
      <span class="material-icons open">open_in_full</span>
      <span class="material-icons close">close_fullscreen</span>
      Panel with open/close
    </mat-panel-title>
Run Code Online (Sandbox Code Playgroud)

这是演示https://stackblitz.com/edit/angular-e2fnlm的链接

当您有多个材质扩展面板时,CSS 解决方案有效


小智 6

为示例中的 mat-expansion-panel 面板命名。使用 mat-expansion-panel 的 Expanded 属性来显示或隐藏 + 或 - 图标。

 <mat-expansion-panel #panel  hideToggle>
        <mat-expansion-panel-header>
             <mat-panel-title>
                        Buttons
             </mat-panel-title>
             <mat-icon >{{panel.expanded? 'remove' : 'add'}}</mat-icon>
                        
        </mat-expansion-panel-header>
                   
  </mat-expansion-panel>
Run Code Online (Sandbox Code Playgroud)