QWeb调用子模板

Administrator

英文是来自官方,中文是我的翻译。这个文档也是有一处错误的,这已经是我发现的report系列文档的第二个错误,没发现的还不知道有多少呢。


QWeb templates can be used for top-level rendering, but they can also be used from within another template (to avoid duplication or give names to parts of templates) using the t-call directive:

模板可以被用作顶级渲染,但也可以被用到其他模板中(避免写一些重复的代码,也为了能通过名字更好的区分模板的各个部分),这就要用到t-call指令。

<t t-call="other-template"/>

This calls the named template with the execution context of the parent, if other_template is defined as:

上面的代码调用了id为other-template的模板。这里官方强调的是上下文。

<p><t t-value="var"/></p>

the call above will be rendered as <p/> (no content), but:

由于上下文中对var这个变量并没有赋值,所以call之后渲染的<p>标签内是没有内容的。

注意:上面的代码是有问题的,t-value应该改成输出指令,例如t-esc

<t t-set="var" t-value="1"/>
<t t-call="other-template"/>

will be rendered as <p>1</p>.

什么意思呢?假设你能理解父模板与子模板这个概念并且分清这个例子中的父子模板,那么上面的代码意可以理解为:渲染other-template(子模板)的时候,就相当于将子模板的内容替换到父模板中(即<p><t t-value="val"/></p>替换<t t-call="other-template" />),当代码合并起来之后,它们就拥有相同的上下文了。所以上文设置的var变量值为1,下面的代码渲染时就获得了这个值。

However this has the problem of being visible from outside the t-call. Alternatively, content set in the body of the calldirective will be evaluated before calling the sub-template, and can alter a local context:

<t t-call="other-template">
    <t t-set="var" t-value="1"/>
</t>
<!-- "var" does not exist here -->

什么意思?字面上说call指令内部的内容是局部的,外边是看不到的。

The body of the call directive can be arbitrarily complex (not just set directives), and its rendered form will be available within the called template as a magical 0 variable:

<div>
    This template was called with content:
    <t t-raw="0"/>
</div>

being called thus:

<t t-call="other-template">
    <em>content</em>
</t>

will result in:

<div>
    This template was called with content:
    <em>content</em>
</div>

什么意思?就是说我们调用子模板的时候,t-call指令内的内容是插入到子模板的什么位置,这个位置就是由子模板中的t-raw="0"的位置决定的。

留下评论

你应该 登入 张贴评论