2

fill-slotまたは要素の外側で定義された変数が、define-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>

変数を持つ tales-expression はa評価できません。もちろん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 に答える