Skip to content

Input Bindings

It is very common to need to be able to read the value out of an html input (or textarea, or select) in order to use it (note: it does not need to be in a form!). A possible way to do this is to do it by hand:

class Form extends owl.Component {
state = useState({ text: "" });
_updateInputValue(event) {
this.state.text = event.target.value;
}
}
<div>
<input t-on-input="_updateInputValue" />
<span t-esc="state.text" />
</div>

This works. However, this requires a little bit of plumbing code. Also, the plumbing code is slightly different if you need to interact with a checkbox, or with radio buttons, or with select tags.

To help with this situation, Owl has a builtin directive t-model: its value should be an observed value in the component (usually state.someValue). With the t-model directive, we can write a shorter code, equivalent to the previous example:

class Form extends owl.Component {
state = { text: "" };
}
<div>
<input t-model="state.text" />
<span t-esc="state.text" />
</div>

The t-model directive works with <input>, <input type="checkbox">, <input type="radio">, <textarea> and <select>:

<div>
<div>Text in an input: <input t-model="state.someVal"/></div>
<div>Textarea: <textarea t-model="state.otherVal"/></div>
<div>Boolean value: <input type="checkbox" t-model="state.someFlag"/></div>
<div>Selection:
<select t-model="state.color">
<option value="">Select a color</option>
<option value="red">Red</option>
<option value="blue">Blue</option>
</select>
</div>
<div>
Selection with radio buttons:
<span>
<input type="radio" name="color" id="red" value="red" t-model="state.color"/>
<label for="red">Red</label>
</span>
<span>
<input type="radio" name="color" id="blue" value="blue" t-model="state.color" />
<label for="blue">Blue</label>
</span>
</div>
</div>

Like event handling, the t-model directive accepts the following modifiers:

ModifierDescription
.lazyupdate the value on the change event (default is on input event)
.numbertry to parse the value to a number (using parseFloat)
.trimtrim the resulting value

For example:

<input t-model.lazy="state.someVal" />

These modifiers can be combined. For instance, t-model.lazy.number will only update a number whenever the change is done.

Note: the online playground has an example to show how it works.