Почему переменная, определенная вне элемента fill-slot или define-macro, не видна внутри этого элемента?

Почему переменная определена вне 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>

Сказка-выражение с переменной a не может быть оценено. Конечно b виден

С другой стороны, если переменная c определяется во включающем элементе define-slot как следующее, то это видно.

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

Похоже, что переменные оцениваются только после вставки слота.

1 ответ

Решение

Контекст макроса TAL имеет значение только в том случае, если вы просматриваете макрос в этом контексте. Это интерпретируется, если вы просматриваете шаблон, содержащий макрос, но не если вы используете макрос. Макросы - в некотором смысле - просто копируют время выполнения из шаблона, содержащего макрос, на страницу, используя его, а затем расширяют. Все пространство имен происходит из шаблона, который использует макрос.

Думать об этом по-другому: макросы не являются областью видимости. Если бы они были, вы бы вообще не смогли увидеть макрос из другого шаблона. TAL должен быть намного сложнее, и вам придется думать о замыканиях и функциях.

"Макро" языки называются так потому, что макросы раскрываются при использовании. Они не являются функциями.

Итак, почему содержащиеся шаблоны вообще включают контекст для макросов? Они не должны. Обычно это делается для того, чтобы макрос мог быть протестирован в реалистичной среде. (Хотя иногда макросы находятся внутри страниц, которые независимо полезны.)

Другие вопросы по тегам