diff --git a/src/component/directive.ts b/src/component/directive.ts index 357b07bb..5c315c93 100644 --- a/src/component/directive.ts +++ b/src/component/directive.ts @@ -211,7 +211,7 @@ QWeb.addDirective({ } else if (!name.startsWith("t-")) { if (name !== "class" && name !== "style") { // this is a prop! - props[name] = ctx.formatExpression(value); + props[name] = ctx.formatExpression(value) || "undefined"; } } } diff --git a/tests/component/__snapshots__/component.test.ts.snap b/tests/component/__snapshots__/component.test.ts.snap index 78fe841d..5d0e2b26 100644 --- a/tests/component/__snapshots__/component.test.ts.snap +++ b/tests/component/__snapshots__/component.test.ts.snap @@ -1,5 +1,43 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`basic widget properties can handle empty props 1`] = ` +"function anonymous(context, extra +) { + // Template name: \\"__template__2\\" + let utils = this.constructor.utils; + let QWeb = this.constructor; + let parent = context; + let scope = Object.create(context); + let h = this.h; + let c1 = [], p1 = {key:1}; + let vn1 = h('div', p1, c1); + // Component 'Child' + let w2 = '__3__' in parent.__owl__.cmap ? parent.__owl__.children[parent.__owl__.cmap['__3__']] : false; + let props2 = {val:undefined}; + if (w2 && w2.__owl__.currentFiber && !w2.__owl__.vnode) { + w2.destroy(); + w2 = false; + } + if (w2) { + w2.__updateProps(props2, extra.fiber, undefined); + let pvnode = w2.__owl__.pvnode; + c1.push(pvnode); + } else { + let componentKey2 = \`Child\`; + let W2 = context.constructor.components[componentKey2] || QWeb.components[componentKey2]|| scope['Child']; + if (!W2) {throw new Error('Cannot find the definition of component \\"' + componentKey2 + '\\"')} + w2 = new W2(parent, props2); + parent.__owl__.cmap['__3__'] = w2.__owl__.id; + let fiber = w2.__prepare(extra.fiber, undefined, () => { const vnode = fiber.vnode; pvnode.sel = vnode.sel; }); + let pvnode = h('dummy', {key: '__3__', hook: {remove() {},destroy(vn) {w2.destroy();}}}); + c1.push(pvnode); + w2.__owl__.pvnode = pvnode; + } + w2.__owl__.parentLastFiberId = extra.fiber.id; + return vn1; +}" +`; + exports[`basic widget properties reconciliation alg works for t-foreach in t-foreach 1`] = ` "function anonymous(context, extra ) { diff --git a/tests/component/component.test.ts b/tests/component/component.test.ts index b0edf283..5fc8c529 100644 --- a/tests/component/component.test.ts +++ b/tests/component/component.test.ts @@ -147,6 +147,21 @@ describe("basic widget properties", () => { expect(fixture.innerHTML).toBe("
1
"); }); + test("can handle empty props", async () => { + class Child extends Component { + static template = xml``; + } + class Parent extends Component { + static template = xml`
`; + static components = { Child }; + } + + const parent = new Parent(); + await parent.mount(fixture); + expect(env.qweb.templates[Parent.template].fn.toString()).toMatchSnapshot(); + expect(fixture.innerHTML).toBe( "
"); + }); + test("cannot be clicked on and updated if not in DOM", async () => { class Counter extends Component { static template = xml`