Angular 带可展开行的角度(7+;)材质表-同时多个展开行

Angular 带可展开行的角度(7+;)材质表-同时多个展开行,angular,angular-material,angular-material-table,Angular,Angular Material,Angular Material Table,我正在使用 我希望在单击行时展开多行。默认行为是在单击新行时关闭先前展开的行。我不想关闭前一个,每个都应该保持打开状态,直到再次单击。如何才能做到这一点?要实现这一点,您必须在数据源中再添加一个属性,如expanded:true,然后单击行进行更改,在数据源中切换此属性,并基于此属性更改HTML中的类以进行扩展 添加了代码片段以防链接中断 const ELEMENT_DATA: PeriodicElement[] = [ { ... expanded: false },

我正在使用


我希望在单击行时展开多行。默认行为是在单击新行时关闭先前展开的行。我不想关闭前一个,每个都应该保持打开状态,直到再次单击。如何才能做到这一点?

要实现这一点,您必须在数据源中再添加一个属性,如
expanded:true
,然后单击行进行更改,在数据源中切换此属性,并基于此属性更改HTML中的类以进行扩展

添加了代码片段以防链接中断

const ELEMENT_DATA: PeriodicElement[] = [
  {
    ...
    expanded: false
  },
  {
    ...
    expanded: false
  }
]
单击行,只需切换
expanded
属性(不需要循环),还可以基于相同的
expanded
属性添加类

<div class="example-element-detail"
           [@detailExpand]="element.expanded ? 'expanded' : 'collapsed'">
...
</div>

<tr mat-row *matRowDef="let element; columns: columnsToDisplay;"
      [class.example-expanded-row]="element.expanded"
      (click)="element.expanded = !element.expanded">
</tr>

...

这里是另一种方法

只需将变量设置为数组

expandedElement: PeriodicElement[] = [];
在“动画”部分,使用函数而不是直接检查

[@detailExpand]="checkExpanded(element) ? 'expanded' : 'collapsed'"
并在添加类时使用相同的函数

[class.example-expanded-row]="checkExpanded(element)"
然后单击进行函数调用。如果元素存在,则将其从数组中删除,如果不存在,则将其添加

(click)="pushPopElement(element)"
下面是使用的两个函数。请随时提高方法的效率。这是一个在短时间内为演示编写的粗糙方法

checkExpanded(element): boolean {
    let flag = false;
    this.expandedElement.forEach(e => {
      if(e === element) {
        flag = true;

      }
    });
    return flag;
  }

  pushPopElement(element) {
    const index = this.expandedElement.indexOf(element);
    console.log(index);
    if(index === -1) {
        this.expandedElement.push(element);
    } else {
      this.expandedElement.splice(index,1);
    }
  }
您可以在此处找到工作示例: