子模板中传递给变量的范围是什么?

huangapple go评论48阅读模式
英文:

What is the scope of the variables passed to subtemplates in QWeb?

问题

我正在使用Odoo 13,但这是一个QWeb的问题:

我在QWeb中有以下模板:

在另一个模板中,我两次调用它,如下所示:



Inside main template:

因此,当我调用主模板时,我期望得到这个结果:

Inside subtemplate: 2
Inside subtemplate: 3
Inside main template: 3

然而,我得到了这个结果:

Inside subtemplate: 2
Inside subtemplate: 2
Inside main template: 1

变量不能在子模板中修改吗?如何执行这样一个简单的任务的任何想法?

英文:

I am using Odoo 13, but this is a QWeb question:

I got the following template in QWeb:

<template id="my_subtemplate">
    <t t-set="foo" t-value="foo + 1"/>
    <p>Inside subtemplate: <t t-esc="foo"/></p>
</template>

In other template, I call it twice, this way:

<t t-set="foo" t-value="1"/>
<t t-call="my_module.my_subtemplate"/>
<t t-call="my_module.my_subtemplate"/>
<p>Inside main template: <t t-esc="foo"/></p>

So when I call the main template, I expect to get this result:

Inside subtemplate: 2
Inside subtemplate: 3
Inside main template: 3

However, I am getting this one:

Inside subtemplate: 2
Inside subtemplate: 2
Inside main template: 1

Can't variables be modified in a subtemplate? Any ideas of how to do such a simple task?

答案1

得分: 2

To the first question: 似乎在子模板中不可能实现。来自13.0文档的引用:

或者,在调用指令的正文中设置的内容将在调用子模板之前进行评估,并且可以更改本地上下文

我将“本地上下文”解释为您的内部 foo 的范围仅限于子模板,就像拥有外部 foo 的副本一样。

Second question: 难度较大。您可以使用循环,如下所示:

<t t-set="foo" t-value="1"/>
<t t-for="your_iterable" t-as="item">
  <t t-set="foo" t-value="foo + 1"/>
  <t t-call="my_module.my_subtemplate"/>
<p>主模板内部: <t t-esc="foo"/></p>

<!-- 子模板不要使用 t-set!!! -->

可能会有效,因为现在 foo 一直在同一范围内。

英文:

To the first question: seems it's not possible in subtemplates. A quote from the 13.0 doc:

> Alternatively, content set in the body of the call directive will be
> evaluated before calling the sub-template, and can alter a local
> context
:

I interpret "local context" as the scope of your inner foo stays in the subtemplate, like having a copy of the outer foo.

Second question: difficult. You could use loops, like:

&lt;t t-set=&quot;foo&quot; t-value=&quot;1&quot;/&gt;
&lt;t t-for=&quot;your_iterable&quot; t-as=&quot;item&quot;&gt;
  &lt;t t-set=&quot;foo&quot; t-value=&quot;foo + 1&quot;/&gt;
  &lt;t t-call=&quot;my_module.my_subtemplate&quot;/&gt;
&lt;p&gt;Inside main template: &lt;t t-esc=&quot;foo&quot;/&gt;&lt;/p&gt;

&lt;!-- subtemplate without t-set!!! --&gt;

Could work, because now foo stays in the same scope all the time.

huangapple
  • 本文由 发表于 2023年4月19日 22:53:06
  • 转载请务必保留本文链接:https://go.coder-hub.com/76055944.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定