Saltearse al contenido

Enlaces de entrada

Es muy común que sea necesario poder leer el valor de un input html (o textarea, o select) para poder usarlo (nota: ¡no necesita estar en un formulario!). Una forma posible de hacer esto es hacerlo a mano:

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>

Esto funciona. Sin embargo, requiere un poco de código de plomería. Además, el código de plomería es ligeramente diferente si necesita interactuar con una casilla de verificación, con botones de opción o con etiquetas de selección.

Para ayudar con esta situación, Owl tiene una directiva incorporada t-model: su valor debe ser un valor observado en el componente (normalmente state.someValue). Con la directiva t-model, podemos escribir un código más corto, equivalente al ejemplo anterior:

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

La directiva t-model funciona con <input>, <input type="checkbox">, <input type="radio">, <textarea> y <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>

Al igual que el manejo de eventos, la directiva t-model acepta los siguientes modificadores:

ModificadorDescripción
.lazyActualizar el valor en el evento cambio (el valor predeterminado es en el evento entrada)
.numberIntente analizar el valor en un número (usando parseFloat)
.trimrecortar el valor resultante

Por ejemplo:

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

Estos modificadores se pueden combinar. Por ejemplo, t-model.lazy.number solo actualizará un número cuando se realice el cambio.

nota: el patio de juegos en línea tiene un ejemplo para mostrar como funciona.