diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 7c31945a..11c9bdb7 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -367,9 +367,9 @@ function parseDOMNode(node: Element, ctx: ParsingContext): AST | null { const isSelect = tagName === "select"; const isCheckboxInput = isInput && typeAttr === "checkbox"; const isRadioInput = isInput && typeAttr === "radio"; - const hasLazyMod = attr.includes(".lazy"); - const hasNumberMod = attr.includes(".number"); const hasTrimMod = attr.includes(".trim"); + const hasLazyMod = hasTrimMod || attr.includes(".lazy"); + const hasNumberMod = attr.includes(".number"); const eventType = isRadioInput ? "click" : isSelect || hasLazyMod ? "change" : "input"; model = { diff --git a/tests/components/__snapshots__/t_model.test.ts.snap b/tests/components/__snapshots__/t_model.test.ts.snap index 1d1e0e90..dd043ab4 100644 --- a/tests/components/__snapshots__/t_model.test.ts.snap +++ b/tests/components/__snapshots__/t_model.test.ts.snap @@ -44,7 +44,26 @@ exports[`t-model directive .trim modifier 1`] = ` let { text, createBlock, list, multi, html, toggler, comment } = bdom; let { toNumber } = helpers; - let block1 = createBlock(\`
\`); + let block1 = createBlock(\`
\`); + + return function template(ctx, node, key = \\"\\") { + const bExpr1 = ctx['state']; + const expr1 = 'text'; + let prop1 = bExpr1[expr1]; + let hdlr1 = [(ev) => { bExpr1[expr1] = ev.target.value.trim(); }]; + let txt1 = ctx['state'].text; + return block1([prop1, hdlr1, txt1]); + } +}" +`; + +exports[`t-model directive .trim modifier implies .lazy modifier 1`] = ` +"function anonymous(app, bdom, helpers +) { + let { text, createBlock, list, multi, html, toggler, comment } = bdom; + let { toNumber } = helpers; + + let block1 = createBlock(\`
\`); return function template(ctx, node, key = \\"\\") { const bExpr1 = ctx['state']; diff --git a/tests/components/t_model.test.ts b/tests/components/t_model.test.ts index 2d6fd0bc..83d36787 100644 --- a/tests/components/t_model.test.ts +++ b/tests/components/t_model.test.ts @@ -331,6 +331,32 @@ describe("t-model directive", () => { expect(fixture.innerHTML).toBe("
test
"); }); + test(".trim modifier implies .lazy modifier", async () => { + class SomeComponent extends Component { + static template = xml` +
+ + +
+ `; + state = useState({ text: "" }); + } + const comp = await mount(SomeComponent, fixture); + + expect(fixture.innerHTML).toBe("
"); + + const input = fixture.querySelector("input")!; + input.value = "test "; + input.dispatchEvent(new Event("input")); + await nextTick(); + expect(comp.state.text).toBe(""); + expect(fixture.innerHTML).toBe("
"); + input.dispatchEvent(new Event("change")); + await nextTick(); + expect(comp.state.text).toBe("test"); + expect(fixture.innerHTML).toBe("
test
"); + }); + test(".number modifier", async () => { class SomeComponent extends Component { static template = xml`