From 1f9ec46236493a792c823751c8722cf638521923 Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Thu, 6 Jun 2019 08:49:29 +0200 Subject: [PATCH] [FIX] qweb: keep ref of unmounted (kept alive) widget Fixes #120 --- src/qweb_extensions.ts | 4 ++-- tests/component.test.ts | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/qweb_extensions.ts b/src/qweb_extensions.ts index c4a60714..81375ea0 100644 --- a/src/qweb_extensions.ts +++ b/src/qweb_extensions.ts @@ -426,8 +426,8 @@ QWeb.addDirective({ let finalizeWidgetCode = `w${widgetID}.${ keepAlive ? "unmount" : "destroy" }();`; - if (ref) { - finalizeWidgetCode += `delete context.refs[${refKey}];`; // FIXME: shouldn't we keep ref if keepAlive is true? + if (ref && !keepAlive) { + finalizeWidgetCode += `delete context.refs[${refKey}];`; } if (transition) { finalizeWidgetCode = `let finalize = () => { diff --git a/tests/component.test.ts b/tests/component.test.ts index af07bc27..71b7d678 100644 --- a/tests/component.test.ts +++ b/tests/component.test.ts @@ -1144,6 +1144,40 @@ describe("composition", () => { expect(input2.value).toBe("test"); }); + test("sub widget with t-ref and t-keepalive", async () => { + env.qweb.addTemplates(` + +
+ +
+ Hello +
` + ); + class ParentWidget extends Widget { + state = { ok: true }; + widgets = { ChildWidget }; + } + class ChildWidget extends Widget {} + const widget = new ParentWidget(env); + await widget.mount(fixture); + let child = children(widget)[0]; + + expect(fixture.innerHTML).toBe('
Hello
'); + expect(widget.refs.child).toEqual(child); + + widget.state.ok = false; + await nextTick(); + + expect(fixture.innerHTML).toBe('
'); + expect(widget.refs.child).toEqual(child); + + widget.state.ok = true; + await nextTick(); + + expect(fixture.innerHTML).toBe('
Hello
'); + expect(widget.refs.child).toEqual(child); + }); + test("sub widgets rendered in a loop", async () => { env.qweb.addTemplate("ChildWidget", ``); class ChildWidget extends Widget {}