コンポーネントプロパティgroups
に次の配列がある場合:
[
{
"name": "pencils",
"items": ["red pencil","blue pencil","yellow pencil"]
},
{
"name": "rubbers",
"items": ["big rubber","small rubber"]
},
]
各行にすべてのアイテムを含むhtmlテーブルを作成する方法は?期待されるHTML結果:
<table>
<tr><td><h1>pencils</h1></td></tr>
<tr><td>red pencil</td></tr>
<tr><td>blue pencil</td></tr>
<tr><td>yellow pencil</td></tr>
<tr><td><h1>rubbers</h1></td></tr>
<tr><td>big rubber</td></tr>
<tr><td>small rubber</td></tr>
</table>
最初のレベルは簡単です:
<table>
<tr *ngFor="#group of groups">
<td><h1>{{group.name}}</h1></td>
</tr>
</table>
しかし、今は#item of group
を反復処理する必要があります。問題は、新しい<tr>
要素が必要なことですaftergroup
を定義する</tr>
要素、not inside。
Angular2テンプレートにこの種の問題の解決策はありますか? domに書き込まれない<tr>
の代わりに使用できる特別なタグが必要です。 JSFのファセットとフラグメントに似たもの。
<table>
<ng-container *ngFor="let group of groups">
<tr><td><h2>{{group.name}}</h2></td></tr>
<tr *ngFor="let item of group.items"><td>{{item}}</td></tr>
</ng-container>
</table>
ngFor
のテンプレート構文をgroups
に使用し、その中の通常の構文を次のような実際の行に使用できます。
<table>
<template let-group ngFor [ngForOf]="groups">
<tr *ngFor="let row of group.items">{{row}}</tr>
</template>
</table>
ここに基本的なアプローチがあります-それは確かに改善することができます-私があなたの要件であると理解したものです。
これにより、2つの列が表示されます。1つはグループ名、もう1つはグループに関連付けられたアイテムのリストです。
トリックは、単純にアイテムセル内にリストを含めることです。
<table>
<thead>
<th>Groups Name</th>
<th>Groups Items</th>
</thead>
<tbody>
<tr *ngFor="let group of groups">
<td>{{group.name}}</td>
<td>
<ul>
<li *ngFor="let item of group.items">{{item}}</li>
</ul>
</td>
</tr>
</tbody>
</table>
それはあなたが望んでいた正確な出力ではありませんが、おそらくこのようなことができるでしょう。親cmp:
<table>
<item *ngFor="#i of items" [data]="i"></item>
</table>
子cmp
import {Component} from 'angular2/core';
@Component({
selector: `item`,
inputs: ['data'],
template: `
<tr><td>{{data.name}}</td></tr>
<tr *ngFor="#i of data.items">
<td><h1>{{i}}</h1></td>
</tr>
`
})
export default class Item {
}
これを試して。 「template」ディレクティブで定義されたローカル変数のスコープ。
<table>
<template ngFor let-group="$implicit" [ngForOf]="groups">
<tr>
<td>
<h2>{{group.name}}</h2>
</td>
</tr>
<tr *ngFor="let item of group.items">
<td>{{item}}</td>
</tr>
</template>
</table>
これは私のために働いた。
<table>
<tr>
<td *ngFor="#group of groups">
<h1>{{group.name}}</h1>
</td>
</tr>
</table>
私は、可能な限りテンプレートからロジックを排除するのが好きです。気になるデータをテンプレートに返すヘルパー関数を作成することをお勧めします。例えば:
getItemsForDisplay():String[] {
return [].concat.apply([],this.groups.map(group => group.items));
};
<tr *ngFor="let item of getItemsForDisplay()"><td>{{item}}</td></tr>
これにより、プレゼンテーションを特別なロジックから解放できます。これにより、データソースを「直接」使用することもできます。