Placeholder syntax
Placeholders are the bridge that feeds JS data into components. The syntax is dead simple: wrap a variable name or path in ${...}.
The old {...} form is still compatible and is normalized to ${...} when saved. Use ${...} for new templates.
Basics: ${variableName}
In JS:
this.title = "Hello"
this.count = 42
In a component's content field:
${title} → shows: Hello
You have ${count} new messages → shows: You have 42 new messages
Going further: ${object.field} dot-path
If your variable is an object or array, you can drill in with dot / bracket notation:
this.user = {
name: "Alice",
badges: ["VIP", "Newbie"]
}
${user.name} → Alice
${user.badges[0]} → VIP
Any level of nesting works: ${a.b[0].c.d} resolves fine.
Older versions required ${$.user.name}; with this update, dot-paths now work without a prefix.
Force global: ${$.xxx}
The $. prefix means "bypass the loop scope and look in the outermost global scope".
You won't usually need this — only when writing a loop where a variable inside the loop collides with a global variable name outside.
this.row = "outer"
this.list = [{ name: "A" }, { name: "B" }]
Inside the loop:
${row} → current loop item, e.g. {name:"A"}
${$.row} → "outer" ← force read from global
Loop data source: ${array[variableName]}
This form is only used in the "loop data source" field of containers like loop / vstack / hstack. It means: iterate over an array, naming each item with a given variable, so child components can use that variable.
this.rows = [
{ title: "Apple", price: 5 },
{ title: "Banana", price: 3 }
]
In the container's loop data source field:
${rows[row]}
This means — iterate over rows, calling each item row. Child components can then write:
${row.title} → Apple / Banana
${row.price} → 5 / 3
Nested loops are supported too:
Outer data source: ${rows[row]}
Inner data source: ${row.cells[cell]} ← use the `cells` field of the outer `row`
Inner component: ${cell.text}
See Loop component for details.
What happens when a value can't be found?
- Placeholder doesn't exist → replaced with an empty string
"", no error - You wrote the wrong path → same thing, shows blank (so use
console.logto check)
Cheat sheet
| Syntax | Meaning |
|---|---|
${name} | Read this.name |
${user.name} | Read this.user.name |
${list[0]} | Read this.list[0] |
${a.b[2].c} | Any level of nesting |
${$.name} | Force global, skip loop scope |
${rows[row]} | Loop: used in the "loop data source" field |
text ${x} text | Multiple placeholders can mix inside one string |