是否可以创建一个带有额外指令的 angular material mat-table 组件,但仍保持列动态?

Is it possible to create an angular material mat-table component with extra directives but still keep columns dynamic?

有没有办法扩展 mat-table 自动包含 matSort 指令(以及其他与列交互的自定义​​指令,如过滤器)并且仍然有内容包含 mat-sort -header 指令?

<mat-table [matSortActive]="sortActive" [matSortDirection]="sortDirection" matSort>        
    <ng-content></ng-content>
</mat-table> 

这里有一个例子:https://stackblitz.com/edit/angular-bxsavu.

我尝试自己创建一个组件,它只是将 <ng-content> 放入 <table> 元素中,但这会产生错误:

DwfTableComponent.html:1 ERROR Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered. at getTableMissingRowDefsError (table-errors.ts:48)

我尝试不向整个模板添加任何内容,只使用原始 CDK_TABLE_TEMPLATE(在 stackblitz link above 中看到),这会产生错误:

ERROR TypeError: Cannot read property 'viewContainer' of undefined at DwfMatTableExtendedComponent.CdkTable._forceRenderHeaderRows (table.ts:854)

所以看起来我真的无法获得任何动力来完成这项工作。

这一切的背景是我们的站点有许多 table 需要排序,但是我们需要开发人员能够在编写标记时写出哪些列是排序的 table .如果我能让它为 MatSort 工作,我就可以将它应用到我自己的服务器端过滤组件,它的行为非常像 MatSort 功能(在 <table> 元素中有一个 customFilter 指令,在 <th mat-header-cell *matHeaderCellDef> 点内有一个 custom-filter-header 指令)。然后它的一大块将是另一个功能,它允许 table 在 table “暂停”时更改单元格显示的内容(links 或文本)——另一个功能是由包装器控制,但需要影响内部内容。

我们当前的“table-wrapper”(搜索 windows、导出、分页)中还有许多其他功能,但这一部分一直是混淆的源头。当我不能制作一个由两个众所周知的组件组成的组件并且仍然保持 table 结构灵活时,我会有一点破碎的感觉。我确定我遗漏了其中的一部分,但这将大大减少我们必须编写的每个 table 代码的重复。

我通过使用原始 CDK_TABLE_TEMPLATE 并扩展源代码中的 CdkTable,成功地获得了 table 和 运行。从那里,我将 MatSort 指令放在我自己的组件上,然后像往常一样填写内容。

一路上有几个颠簸。对于初学者,您必须在模块中导入 CdkTableModule。接下来,您必须实施 OnInit 并调用 super.ngOnInit() 才能使其呈现。然后样式需要使用源代码的 table.scss,即使那样,您也需要调整一些东西才能让它看起来正确。

在这一点上,感觉就像我漫游到黑客领域,但终于有了牵引力,我想在我弄清楚为什么没有发生默认排序(以及没有出现字形)之后,我将着手将其扩展到我需要的范围。它绝不是为生产做好准备,但开发已导致对 angular 限制和能力的快速教育。

如果有人好奇,同样的 link https://stackblitz.com/edit/angular-bxsavu 提供了我现在所处的位置。