编辑:关于可能的答案:我也遇到过这个问题/答案并以这种方式实施。但是,对于新版本的Angular2,语法是不同的。有关ngFor的文档未更新(这是我查看的位置)。所以我写了错误的代码。有关ngFor的文档已在Template Syntax - ngFor中更新。 Günter写了一个关于如何在较新版本的Angular2(beta17或更高版本)中使用它的正确示例。
我想在循环中创建多个元素。这就是我现在所拥有的:
<table>
<thead>
<th>ID</th>
<th>Name</th>
</thead>
<tbody>
<tr *ngFor="let item of items" class="info">
<td>{{ item['id'] }}</td>
<td>{{ item['name'] }}<td>
</tr>
</tbody>
</table>
我想要的是tr
另一个tr
details
。所需的输出在浏览器中应如下所示:
<table>
<thead>
<th>ID</th>
<th>Name</th>
</thead>
<tbody>
<tr class="info">
<td>1</td>
<td>Item 1<td>
</tr>
<tr class="details">
<!-- More detailed info about item 1 -->
</tr>
<tr class="info">
<td>2</td>
<td>Item 2<td>
</tr>
<tr class="details">
<!-- More detailed info about item 2 -->
</tr>
</tbody>
</table>
如何达到预期效果?
答案 0 :(得分:9)
<template ngFor [ngForOf]="items" let-item>
是*ngFor
的规范,允许重复多个元素。
import {Component} from '@angular/core'
@Component({
selector: 'my-app',
providers: [],
template: `
<div>
<h2>Hello {{name}}</h2>
<table>
<thead>
<th>ID</th>
<th>Name</th>
</thead>
<tbody>
<template ngFor [ngForOf]="items" let-item>
<tr class="info">
<td>{{ item['id'] }}</td>
<td>{{ item['name'] }}<td>
</tr>
<tr class="details">
<td>{{ item['description'] }}<td>
</tr>
</template>
</tbody>
</table>
</div>
`,
directives: []
})
export class App {
items = [
{name: 'name1', id: 1, description: 'description1'}
{name: 'name2', id: 2, description: 'description2'}
{name: 'name3', id: 3, description: 'description3'}
];
constructor() {
this.name = 'Angular2 (Release Candidate!)'
}
}
与Polymer(例如)相反,在<template>
(或其他表格元素<tbody>
)中使用<tr>, ...
在IE 中也适用于Angular2,因为Angular2在内部处理模板,从不将它添加到DOM。在Polymer中这不起作用,因为IE从表元素中删除了“意外”标签(打破了Poymers <template is="dom-repeat">
)
另请参阅http://caniuse.com/#search=template
答案 1 :(得分:2)
使用以下组件代码:
import { Component } from '@angular/core';
@Component({
selector: 'demo-app',
templateUrl: 'app/app.component.html',
pipes: []
})
export class AppComponent {
constructor() {
this.items = [
{id: 1, name: 'Bob', details: 'Bob details'},
{id: 2, name: 'Sarah', details: 'Sarah details'},
{id: 3, name: 'Sam', details: 'Sam details'},
{id: 4, name: 'Susan', details: 'Susan details'}
];
}
}
使用以下app.component.html
文件:
<table>
<thead>
<th>ID</th>
<th>Name</th>
</thead>
<tbody>
<template ngFor [ngForOf]="items" let-item>
<tr class="info">
<td>{{ item['id'] }}</td>
<td>{{ item['name'] }}<td>
</tr>
<tr class="details">
<td colspan=2>{{ item['details'] }}</td>
<!-- More detailed info about item -->
</tr>
</template>
</tbody>
</table>
结果是这样的:
<table>
<thead>
<th>ID</th>
<th>Name</th>
</thead>
<tbody>
<tr class="info">
<td>1</td>
<td>Bob</td><td>
</td></tr>
<tr class="details">
<td colspan="2">Bob details</td>
</tr>
<tr class="info">
<td>2</td>
<td>Sarah</td><td>
</td></tr>
<tr class="details">
<td colspan="2">Sarah details</td>
</tr>
<tr class="info">
<td>3</td>
<td>Sam</td><td>
</td></tr>
<tr class="details">
<td colspan="2">Sam details</td>
</tr>
<tr class="info">
<td>4</td>
<td>Susan</td><td>
</td></tr>
<tr class="details">
<td colspan="2">Susan details</td>
</tr>
</tbody>
</table>
有关详细信息,请参阅https://coryrylan.com/blog/angular-2-ng-for-syntax
答案 2 :(得分:1)
您可以通过循环<tbody>
而不是<tr>
来实现这一目标,因为具有多个tbody的表在html refer to中有效。
所以你的代码就像
<table>
<thead>
<th>ID</th>
<th>Name</th>
</thead>
<tbody *ngFor="let item of items; #idx = index">
<tr class="info">
<td>{{idx}}</td>
<td>Item {{idx}}<td>
</tr>
<tr class="details">
<td>{{ item['id'] }}</td>
<td>{{ item['name'] }}<td>
</tr>
</tbody>
</table>
</table>
答案 3 :(得分:1)
因为不推荐使用Angular v4 <template>
标记。
请改用<ng-template>
,如教程中所述:
ng-template-element