diff --git a/src/component/directive.ts b/src/component/directive.ts index 032ad9e0..d37adbcf 100644 --- a/src/component/directive.ts +++ b/src/component/directive.ts @@ -511,10 +511,6 @@ QWeb.addDirective({ ctx.addLine(`extra.promises.push(def${defID});`); } - if (node.hasAttribute("t-if") || node.hasAttribute("t-else") || node.hasAttribute("t-elif")) { - ctx.closeIf(); - } - return true; } }); diff --git a/src/qweb/base_directives.ts b/src/qweb/base_directives.ts index c0e0b773..a44e6e32 100644 --- a/src/qweb/base_directives.ts +++ b/src/qweb/base_directives.ts @@ -258,10 +258,6 @@ QWeb.addDirective({ ctx.addLine("}"); } - if (node.hasAttribute("t-if") || node.hasAttribute("t-else") || node.hasAttribute("t-elif")) { - ctx.closeIf(); - } - return true; } }); diff --git a/src/qweb/qweb.ts b/src/qweb/qweb.ts index 40ea36e4..b638bada 100644 --- a/src/qweb/qweb.ts +++ b/src/qweb/qweb.ts @@ -452,6 +452,8 @@ export class QWeb extends EventBus { fullName: string; }[] = []; + const finalizers: typeof validDirectives = []; + // maybe this is not optimal: we iterate on all attributes here, and again // just after for each directive. for (let i = 0; i < attributes.length; i++) { @@ -496,7 +498,11 @@ export class QWeb extends EventBus { } } } + for (let { directive, value, fullName } of validDirectives) { + if (directive.finalize) { + finalizers.push({ directive, value, fullName }); + } if (directive.atNodeEncounter) { const isDone = directive.atNodeEncounter({ node, @@ -506,6 +512,9 @@ export class QWeb extends EventBus { value }); if (isDone) { + for (let { directive, value, fullName } of finalizers) { + directive.finalize!({ node, qweb: this, ctx, fullName, value }); + } return; } } @@ -564,10 +573,8 @@ export class QWeb extends EventBus { ctx.addLine(`utils.addNameSpace(vn${ctx.parentNode});`); } - for (let { directive, value, fullName } of validDirectives) { - if (directive.finalize) { - directive.finalize({ node, qweb: this, ctx, fullName, value }); - } + for (let { directive, value, fullName } of finalizers) { + directive.finalize!({ node, qweb: this, ctx, fullName, value }); } } diff --git a/tests/qweb/__snapshots__/qweb.test.ts.snap b/tests/qweb/__snapshots__/qweb.test.ts.snap index 67d1be36..b7767f3d 100644 --- a/tests/qweb/__snapshots__/qweb.test.ts.snap +++ b/tests/qweb/__snapshots__/qweb.test.ts.snap @@ -1467,6 +1467,41 @@ exports[`t-if can use some boolean operators in expressions 1`] = ` }" `; +exports[`t-if t-esc with t-elif 1`] = ` +"function anonymous(context,extra +) { + var h = this.h; + let c1 = [], p1 = {key:1}; + var vn1 = h('div', p1, c1); + if (false) { + c1.push({text: \`abc\`}); + } + else { + var _2 = 'x'; + if (_2 || _2 === 0) { + c1.push({text: _2}); + } + } + return vn1; +}" +`; + +exports[`t-if t-esc with t-if 1`] = ` +"function anonymous(context,extra +) { + var h = this.h; + let c1 = [], p1 = {key:1}; + var vn1 = h('div', p1, c1); + if (true) { + var _2 = 'x'; + if (_2 || _2 === 0) { + c1.push({text: _2}); + } + } + return vn1; +}" +`; + exports[`t-key can use t-key directive on a node 1`] = ` "function anonymous(context,extra ) { diff --git a/tests/qweb/qweb.test.ts b/tests/qweb/qweb.test.ts index cbc5daaf..e3e62969 100644 --- a/tests/qweb/qweb.test.ts +++ b/tests/qweb/qweb.test.ts @@ -328,6 +328,16 @@ describe("t-if", () => { }; expect(normalize(renderToString(qweb, "test", context))).toBe("