Published unlisted
Edited
Dec 7, 2021
Insert cell
# Form with composite data and some controls
Insert cell
viewof data = Inputs.input(undefined) //required for reactivity when you click 'additem' button
Insert cell
viewof controls = Inputs.input([5, 59, 54].map(control))
Insert cell
viewof controlValues = [...data.map(v => v.value)]
Insert cell
controls, inputsForm()
Insert cell
controls, inputsForm()
Insert cell
control = (v) => {
let a = html`<div></div>`
a.value = v
return a
}
Insert cell
Insert cell
initializeData = {
setData(viewof controls.value)
}
Insert cell
inputsForm = () => html`
${addButton()}
${viewof data.value.map((o, i) => Inputs.bind(Inputs.range([0, 255], {step: 1}), viewof data.value[i]))}` //doesnt' matter if you map `data` or `controls`, works the same.
Insert cell
setData = (val) => {
val.map(div => div.oninput = () => set(viewof data, val))
set(viewof data, val)
}
Insert cell
addButton = () => {
let out = html`<button>+ add item</button>`
out.onclick = () => {
//console.log(...(viewof controls.value).map(v => v.value))
let val = [...(viewof controls.value).map(v => v.value), 5].map(control)
set(viewof controls, val)
setData(val)
}
return out
}
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more