Repeater
The Repeater binds to a dataset and renders its children once per row. It is the generic "for each" container — use it when a table is too tabular (cards, chips, timelines) or when you want custom per-row layouts.
Inside any child, the current row is addressable via Field.<name>. Iteration metadata (index, count, isFirst, isLast, isEven, isOdd) is automatically merged into Variables.* for that iteration scope.
Binding options: a datasource (recommended), or a dataset expression that returns an array. Per-row filter, sortBy (+ direction), offset and limit run in that order before rendering. Layout can be stack, grid, or inline.
Notes & gotchas
- Field.<name> is the only row accessor. Inside a repeater child, use
=Field.region, notDatasources.orders.region— the repeater does not create a row-scoped datasource alias. - Iteration metadata lives in Variables.
Variables.iterationIndexis 0-based;Variables.iterationNumberis 1-based. These never leak outside the repeater subtree. - Component-scoped variables declared on the repeater itself are writable per-iteration via cell-item actions (when the child is a table). Reads from outside see the global / outer scope. Same scope rules as anywhere else.
- Runtime cost. Each child subtree is rendered per row. Keep the template small, or pair the repeater with a limit when the dataset is large. The repeater itself does not paginate.
- Children use drag-and-drop. In the builder, the repeater accepts the same child types as a column cell. Drag components into its drop zone; they become the iteration template.