Jos*_*osh 5 html html-table angular
我正在使用嵌套的数据编写一个 HTML 表格组件,这样输出可能如下所示:
<table>
<tr><td>Parent</td></tr>
<tr><td>Child 1</td></tr>
<tr><td>Child 2</td></tr>
<tr><td>Grandchild 1</td></tr>
</table>
Run Code Online (Sandbox Code Playgroud)
我想使用递归组件来创建它,如下所示:
<table>
<data-row *ngFor="let row of rows" [row]="row"></data-row>
</table>
Run Code Online (Sandbox Code Playgroud)
数据行:
<tr><td>{{row.name}}</td></tr>
<data-row *ngFor="let child of row.children" [row]="child"></data-row>
Run Code Online (Sandbox Code Playgroud)
然而,这会在表格行周围添加一个环绕元素,这会破坏表格并且是无效的 HTML:
<table>
<data-row>
<tr>...</tr>
<data-row><tr>...</tr></data-row>
</data-row>
</table>
Run Code Online (Sandbox Code Playgroud)
是否可以删除此data-row包装元素?
一种解决方案:
一种解决方案是使用<tbody data-row...></tbody>我目前正在做的事情,但这会导致嵌套tbody元素,这违反了W3C规范
其他想法:
我尝试过使用ng-container,但似乎不可能,<ng-container data-row...></ng-container>所以这是不可能的。
我也考虑过放弃使用表格,但是使用 HTML 表格是允许将数据简单复制到电子表格中的唯一方法,这是一项要求。
我考虑的最后一个选择是在生成表之前展平数据,但是,由于树可以随意展开和折叠,这会导致过度重新渲染或非常复杂的模型。
编辑:这是我当前解决方案的 Plunk(违反规范):http://plnkr.co/edit/LTex8GW4jfcH38D7RB4V ?p=preview
如果您将行组件包装在 ng-container 中,您应该能够完成它
<tbody>
<ng-container *ngFor="let row of rows; let i = index">
<data-row [row]="row"></data-row>
</ng-container>
</tbody>
Run Code Online (Sandbox Code Playgroud)
@Component({
selector: 'my-app',
template: `
<table>
<ng-container *ngFor="let row of table">
<tbody data-table-row [row]="row"></tbody>
</ng-container>
</table>
`,
})
export class App {
table = [
{
name: 'Parent',
children: [
{
name: 'Child 1'
children: []
},
{
name: 'Child 2'
children: [
{
name: 'Grandchild 1'
children: []
}
]
}
]
}
]
}
@Component({
selector: 'tbody[data-table-row]',
template: `
<tr><td>{{row.name}}</td></tr>
<tbody *ngFor="let child of row.children" data-table-row [row]="child"></tbody>
`
})
export class DataTableRowComponent {
@Input() row: any;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2989 次 |
| 最近记录: |