diff --git a/src/component/directive.ts b/src/component/directive.ts index b1013b38..ee1bf14b 100644 --- a/src/component/directive.ts +++ b/src/component/directive.ts @@ -400,7 +400,12 @@ QWeb.addDirective({ if (hasSlots) { const clone = node.cloneNode(true); - const slotNodes = clone.querySelectorAll("[t-set]"); + const slotNodes: Element[] = []; + for (let el of clone.children) { + if (el.getAttribute("t-set") && el.hasChildNodes()) { + slotNodes.push(el); + } + } const slotId = QWeb.nextSlotId++; ctx.addLine(`w${componentID}.__owl__.slotId = ${slotId};`); if (slotNodes.length) { diff --git a/tests/component/__snapshots__/slots.test.ts.snap b/tests/component/__snapshots__/slots.test.ts.snap index e020d99b..448927e4 100644 --- a/tests/component/__snapshots__/slots.test.ts.snap +++ b/tests/component/__snapshots__/slots.test.ts.snap @@ -469,6 +469,21 @@ exports[`t-slot directive slots are rendered with proper context, part 4 2`] = ` }" `; +exports[`t-slot directive t-set t-value in a slot 1`] = ` +"function anonymous(context, extra +) { + // Template name: \\"__template__1\\" + let h = this.h; + let c4 = [], p4 = {key:4}; + let vn4 = h('span', p4, c4); + const slot5 = this.constructor.slots[context.__owl__.slotId + '_' + 'default']; + if (slot5) { + slot5.call(this, context.__owl__.scope, Object.assign({}, extra, {parentNode: c4, parent: extra.parent || context})); + } + return vn4; +}" +`; + exports[`t-slot directive template can just return a slot 1`] = ` "function anonymous(context, extra ) { diff --git a/tests/component/slots.test.ts b/tests/component/slots.test.ts index 1db57ec3..f43b87bb 100644 --- a/tests/component/slots.test.ts +++ b/tests/component/slots.test.ts @@ -873,4 +873,28 @@ describe("t-slot directive", () => { await parent.mount(fixture); expect(fixture.innerHTML).toBe("

heyaaron

"); }); + + test("t-set t-value in a slot", async () => { + class Dialog extends Component { + static template = xml` + + + `; + } + class Parent extends Component { + static template = xml` +
+ + + + +
`; + static components = { Dialog }; + } + const parent = new Parent(); + await parent.mount(fixture); + + expect(fixture.innerHTML).toBe("
dash
"); + expect(env.qweb.templates[Dialog.template].fn.toString()).toMatchSnapshot(); + }); });