我试图用一个列对象数组创建一个表,这些列对象本身可以包含子列。
标题对象:
export class ListHeader {
id: string;
label: string;
type: int;
subColumns?: ListHeader[];
}
表组件部分代码
columns: ListHeader[];
columnsWithSubColumns: ListHeader[];
constructor(){
this.columns = [{
id: "AC1",
label: "AC1",
type: 1
},
{
id: "AC3",
label: "AC3",
type: 1
},
{
id: "AC2",
label: "AC2",
type: 1,
subColumns: [
{
id: "ColB",
label: "ColB",
type: 1
},
{
id: "ColA",
label: "ColA",
type: 1
},
{
id: "ColC",
label: "ColC",
type: 1
}
]
}
];
this.columnsWithSubColumns = this.columns
.filter(c => typeof c.subColumns !== 'undefined' && c.subColumns !== null && c.subColumns.length > 1);
}
HTML:
<table>
<thead>
<tr>
<th *ngFor='let key of columns' [id]='key.id'>
{{ key.label }}
</th>
</tr>
<tr>
<th *ngFor='let key of columnsWithSubColumns '>
<--! Can't figure how to do from there -->
</th>
</tr>
</thead>
<--! tbody, etc... -->
</table>
我通过修改HTML和/或基本的Typescript绑定了多种解决方案,但是我找不到正确显示子列的方法。它们要么显示在错误的列下,要么根本不显示。
我找到了一个工作的静态表,该表的实际使用量不超过我想要的值(http://jsfiddle.net/8qycxkv9/),但我正在寻求使其动态化。
这样,我试图从Array列中的所有subHeaders数组中创建第二个ListHeader数组。我设法过滤掉没有子列的列,但找不到进一步的方法。
我愿意接受任何实现,唯一的约束就是保留ListHeader
对象。
答案 0 :(得分:1)
尝试一下,它可以按预期工作。
<table>
<thead>
<tr>
<ng-container *ngFor='let key of columns'>
<th *ngIf='key.subColumns' [id]='key.id' [attr.colspan]=key.subColumns.length>
{{ key.label }}
</th>
<th *ngIf='!key.subColumns' [id]='key.id' [attr.rowspan]=2>
{{ key.label }}
</th>
</ng-container>
</tr>
<tr>
<ng-container *ngFor='let key of columnsWithSubColumns'>
<th *ngFor="let sub of key.subColumns">
{{sub.label}}
</th>
</ng-container>
</tr>
</thead>
</table>
答案 1 :(得分:1)
您需要在第一个数组中使用属性“ colspan”,这意味着该标题下将有多少个子标题。
您得到这样的东西:
<table>
<thead>
<tr>
<th *ngFor='let key of columns' [id]='key.id' colspan=key.subColumns.length>
{{ key.label }}
</th>
</tr>
<tr>
<ng-container *ngFor='let key of columns'>
<th *ngFor='let subheader of key.subColumns'>
{{subheader.label}}
</th>
</ng-container>
</tr>
</thead>
<--! tbody, etc... -->
</table>
如果您的某些栏目没有字幕,您可以执行以下操作:
<table>
<thead>
<tr>
<ng-container *ngFor='let key of columns'>
<th *ngIf='key.subColumns' [id]='key.id' [attr.colspan]=key.subColumns.length>
{{ key.label }}
</th>
<th *ngIf='!key.subColumns' [id]='key.id' [attr.rowspan]=2>
{{ key.label }}
</th>
</ng-container>
</tr>
<tr>
<ng-container *ngFor='let key of columns'>
<th *ngFor='let subheader of key.subColumns'>
{{subheader.label}}
</th>
</ng-container>
</tr>
</thead>
<--! tbody, etc... -->
</table>
然后带有字幕的列将很宽,而没有字幕的列将很长。