diff --git a/src/runtime/blockdom/event_catcher.ts b/src/runtime/blockdom/event_catcher.ts index bd59d577..a32edfe9 100644 --- a/src/runtime/blockdom/event_catcher.ts +++ b/src/runtime/blockdom/event_catcher.ts @@ -46,7 +46,7 @@ export function createCatcher(eventsSpec: EventsSpec): Catcher { const target = ev.target; let currentNode: any = self.child.firstNode(); const afterNode = self.afterNode; - while (currentNode !== afterNode) { + while (currentNode && currentNode !== afterNode) { if (currentNode.contains(target)) { return origFn.call(this, ev); } diff --git a/tests/components/__snapshots__/t_on.test.ts.snap b/tests/components/__snapshots__/t_on.test.ts.snap index 76652047..c3a942cd 100644 --- a/tests/components/__snapshots__/t_on.test.ts.snap +++ b/tests/components/__snapshots__/t_on.test.ts.snap @@ -456,3 +456,45 @@ exports[`t-on t-on on t-slots 2`] = ` } }" `; + +exports[`t-on t-on when first component child is an empty component 1`] = ` +"function anonymous(app, bdom, helpers +) { + let { text, createBlock, list, multi, html, toggler, comment } = bdom; + let { createCatcher } = helpers; + const comp1 = app.createComponent(\`Child\`, true, false, false, false); + const catcher1 = createCatcher({\\"click\\":0}); + + let block1 = createBlock(\`
\`); + + return function template(ctx, node, key = \\"\\") { + let hdlr1 = [ctx['push'], ctx]; + const hdlr2 = [()=>{}, ctx]; + const b2 = catcher1(comp1({list: ctx['list']}, key + \`__1\`, node, this, null), [hdlr2]); + return block1([hdlr1], [b2]); + } +}" +`; + +exports[`t-on t-on when first component child is an empty component 2`] = ` +"function anonymous(app, bdom, helpers +) { + let { text, createBlock, list, multi, html, toggler, comment } = bdom; + let { prepareList, withKey } = helpers; + + let block2 = createBlock(\`\`); + + return function template(ctx, node, key = \\"\\") { + ctx = Object.create(ctx); + const [k_block1, v_block1, l_block1, c_block1] = prepareList(ctx['props'].list);; + for (let i1 = 0; i1 < l_block1; i1++) { + ctx[\`c\`] = v_block1[i1]; + ctx[\`c_index\`] = i1; + const key1 = ctx['c_index']; + let txt1 = ctx['c']; + c_block1[i1] = withKey(block2([txt1]), key1); + } + return list(c_block1); + } +}" +`; diff --git a/tests/components/t_on.test.ts b/tests/components/t_on.test.ts index 6acf4c6a..c4b910e0 100644 --- a/tests/components/t_on.test.ts +++ b/tests/components/t_on.test.ts @@ -41,6 +41,30 @@ describe("t-on", () => { expect(steps).toEqual(["click"]); }); + test("t-on when first component child is an empty component", async () => { + class Child extends Component { + static template = xml` + + `; + } + class Parent extends Component { + static template = xml` +
+ `; + static components = { Child }; + list = useState([] as string[]); + push() { + this.list.push("foo"); + } + } + const parent = await mount(Parent, fixture); + const el = elem(parent); + expect(el.innerHTML).toBe(""); + el.click(); + await nextTick(); + expect(el.innerHTML).toBe("foo"); + }); + test("t-on expression in t-foreach", async () => { class Comp extends Component { static template = xml`