2

为什么在 a fill-slotordefine-macro元素之外定义的变量在该元素内不可见?

<body tal:define="a string:a">
    <metal:content-core fill-slot="content-core">
        <metal:content-core define-macro="content-core"
                            tal:define="b string:b">
            <div tal:content="a" />
            <div tal:content="b" />
            <div tal:content="c" />
        </metal:content-core>
    </metal:content-core>
</body>

a无法评估带有变量的 tales-expression 。当然b是可见的。

另一方面,如果变量c在如下的封闭元素中定义,define-slot那么它是可见的。

<div tal:define="c string:c">
    <metal:text define-slot="content-core"></metal:text>
</div>

看起来只有在插入插槽后才会评估变量。

4

1 回答 1

6

只有当您在该上下文中查看宏时,TAL 宏的上下文才有意义。如果您正在查看包含宏的模板,它会被解释,但如果您正在使用宏,则不会。从某种意义上说,宏只是将运行时从包含宏的模板复制到使用它的页面,然后展开。所有的命名空间都来自使用宏的模板。

换一种方式来考虑:宏不是范围语言。如果是这样,您将根本无法从另一个模板中看到宏。TAL 必须非常复杂,并且您必须考虑闭包和函数。

之所以称为“宏”语言,是因为宏在使用时会被扩展。它们不是函数。

那么,为什么包含模板包含宏的上下文呢?他们不必这样做。通常这样做是为了可以在现实环境中测试宏。(虽然有时宏在独立有用的页面内。)

于 2014-02-22T16:07:22.930 回答