Item Template
When developing UI, it is common to display lists of items, and Ensemble simplifies this process by providing the item-template property. When used within certain containers (e.g. Column, Carousel, Grid, ..), you can iterate through a data set and render a set of child widgets.
item-template takes the following properties:
| Property | Type | Description |
|---|---|---|
| data | array | Bind to an array of data from an API response or a variable |
| name | string | Variable name referencing each item in the array. Name it as per your use case (e.g. 'person', 'item' ..) |
| template | Widget | Define the child widget to render for each item in the array. Within this widget you can bind to the item using the name syntax (e.g. ${person.firstName}) |
| indexId | string | (optional) Default: index. The property that will be assigned the current index of the data array while looping through it |
Different containers may expose additional properties to further customize the rendering of the children, but they will always have the data and name.
Basic Usage
To demonstrate the basic usage of item-template, Below we hardcode a list of names and render each as a Text widget. These text widgets will be displayed vertically one after another because they are inside a Column parent, with a gap of 10 in between.
Column:
styles:
gap: 10 # gap between each child
item-template:
data: ["John", "Mary", "Peter"]
name: name
template:
Text:
text: Hello ${name}The output will look something like this:

Binding to API data
In a real-world scenario, you would bind to data from an API response. Below is the shorten JSON payload from hitting "https://randomuser.me/api/?results=5 (opens in a new tab)". We'll be using this to render our UI.
{
"results": [
{
"name": {
"title": "Mrs",
"first": "Lya",
"last": "Brun"
},
"picture": {
"large": "https://randomuser.me/api/portraits/women/9.jpg",
"medium": "https://randomuser.me/api/portraits/med/women/9.jpg",
"thumbnail": "https://randomuser.me/api/portraits/thumb/women/9.jpg"
},
},
... (more entries) ...
],
}Let's update our definition to fetch the API on page load, then show each person's photo and name in a Carousel.
View:
styles:
useSafeArea: true
# call the API upon loading the screen
onLoad:
invokeAPI:
name: getRandomUsers
body:
Carousel:
styles:
layout: multiple
height: 150
multipleItemWidthRatio: .3
indicatorType: circle
item-template:
# bind to API's response body, then access the 'results' array within it
data: ${getRandomUsers.body.results}
# name each item in the array as 'person'
name: person
template:
Column:
styles:
crossAxis: center
gap: 10
children:
- Image:
styles:
width: 60
height: 60
borderRadius: 1000
borderColor: grey
# the JSON response
source: ${person.picture.medium}
- Text:
styles:
textAlign: center
text: ${person.name.first} ${person.name.last}
API:
getRandomUsers:
url: https://randomuser.me/api/?results=5The output will look something like this:

Here's an example (opens in a new tab) of how to use indexId property to access the current index of the data array.