Given the following array in component property groups
:
[
{
"name": "pencils",
"items": ["red pencil","blue pencil","yellow pencil"]
},
{
"name": "rubbers",
"items": ["big rubber","small rubber"]
},
]
How to create a html table with all items, each in one row? The expected HTML result:
<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>
The first level is easy:
<table>
<tr *ngFor="#group of groups">
<td><h1>{{group.name}}</h1></td>
</tr>
</table>
But now I have to iterate #item of group
. The problem is that I need the new <tr>
elements after the </tr>
element which defines group
, not inside.
Is there any solution for this kind of problems in Angular2 templating? I would expect some special tag which I could use instead of <tr>
which is not written into the dom. Something similar to facets and fragments in JSF.
it's not exact output that you wanted but maybe something like this will do. Parent cmp:
Child cmp
Try this. The scope of local variables defined by "template" directive.
Here is a basic approach - it sure can be improved - of what I understood to be your requirement.
This will display 2 columns, one with the groups name, and one with the list of items associated to the group.
The trick is simply to include a list within the items cell.
I am a fan of keeping logic out of the template as much as possible. I would suggest creating a helper function that returns the data that you care about to the template. For instance:
<tr *ngFor="let item of getItemsForDisplay()"><td>{{item}}</td></tr>
This will let you keep your presentation free of special logic. This also lets you use your datasource "directly".
This worked for me.