英文:
What is the scope of the variables passed to subtemplates in QWeb?
问题
我正在使用Odoo 13,但这是一个QWeb的问题:
我在QWeb中有以下模板:
Inside subtemplate:
在另一个模板中,我两次调用它,如下所示:
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:
<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>Inside main template: <t t-esc="foo"/></p>
<!-- subtemplate without t-set!!! -->
Could work, because now foo
stays in the same scope all the time.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论