[FIX] component: t-model properly works with select

The initial value was not set on the select tag.

closes #271
This commit is contained in:
Géry Debongnie
2019-09-04 22:43:17 +02:00
parent c52799de2c
commit 3c23a7b246
3 changed files with 27 additions and 1 deletions
+2 -1
View File
@@ -248,12 +248,13 @@ QWeb.utils.toNumber = function(val: string): number | string {
QWeb.addDirective({
name: "model",
priority: 42,
atNodeCreation({ ctx, nodeID, value, node, fullName }) {
atNodeCreation({ ctx, nodeID, value, node, fullName, addNodeHook }) {
const type = node.getAttribute("type");
let handler;
let event = fullName.includes(".lazy") ? "change" : "input";
if (node.tagName === "select") {
ctx.addLine(`p${nodeID}.props = {value: context.state['${value}']};`);
addNodeHook('create', `n.elm.value=context.state['${value}'];`)
event = "change";
handler = `(ev) => {context.state['${value}'] = ev.target.value}`;
} else if (type === "checkbox") {
@@ -1163,6 +1163,11 @@ exports[`t-model directive on a select 1`] = `
p2.props = {value: context.state['color']};
extra.handlers['change' + 2] = extra.handlers['change' + 2] || ((ev) => {context.state['color'] = ev.target.value});
p2.on['change'] = extra.handlers['change' + 2];
p2.hook = {
create: (_, n) => {
n.elm.value=context.state['color'];
},
};
var _3 = '';
let c4 = [], p4 = {key:4,attrs:{value: _3}};
var vn4 = h('option', p4, c4);
+20
View File
@@ -3585,6 +3585,26 @@ describe("t-model directive", () => {
expect(env.qweb.templates.SomeComponent.fn.toString()).toMatchSnapshot();
});
test("on a select, initial state", async () => {
env.qweb.addTemplates(`
<templates>
<div t-name="SomeComponent">
<select t-model="color">
<option value="">Please select one</option>
<option value="red">Red</option>
<option value="blue">Blue</option>
</select>
</div>
</templates>`);
class SomeComponent extends Widget {
state = { color: "red" };
}
const comp = new SomeComponent(env);
await comp.mount(fixture);
const select = fixture.querySelector("select")!;
expect(select.value).toBe("red");
});
test(".lazy modifier", async () => {
env.qweb.addTemplates(`
<templates>