[FIX] qweb: keep ref of unmounted (kept alive) widget

Fixes #120
This commit is contained in:
Aaron Bohy
2019-06-06 08:49:29 +02:00
committed by Géry Debongnie
parent 1464a3631b
commit 1f9ec46236
2 changed files with 36 additions and 2 deletions
+2 -2
View File
@@ -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 = () => {
+34
View File
@@ -1144,6 +1144,40 @@ describe("composition", () => {
expect(input2.value).toBe("test");
});
test("sub widget with t-ref and t-keepalive", async () => {
env.qweb.addTemplates(`
<templates>
<div t-name="ParentWidget">
<t t-if="state.ok"><t t-widget="ChildWidget" t-ref="child" t-keepalive="1"/></t>
</div>
<span t-name="ChildWidget">Hello</span>
</templates>`
);
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('<div><span>Hello</span></div>');
expect(widget.refs.child).toEqual(child);
widget.state.ok = false;
await nextTick();
expect(fixture.innerHTML).toBe('<div></div>');
expect(widget.refs.child).toEqual(child);
widget.state.ok = true;
await nextTick();
expect(fixture.innerHTML).toBe('<div><span>Hello</span></div>');
expect(widget.refs.child).toEqual(child);
});
test("sub widgets rendered in a loop", async () => {
env.qweb.addTemplate("ChildWidget", `<span><t t-esc="props.n"/></span>`);
class ChildWidget extends Widget {}