Por que uma variável é definida fora de um fill-slot
ou define-macro
elemento não visível dentro deste elemento?
<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 expressão de contos com a variável a
não pode ser avaliado. Claro b
é visível.
Por outro lado, se a variável c
é definido no elemento anexo de define-slot
como o seguinte, então é visível.
<div tal:define="c string:c">
<metal:text define-slot="content-core"></metal:text>
</div>
Parece que as variáveis são avaliadas somente após o slot ser inserido.
Respostas:
6 para resposta № 1O contexto de uma macro TAL é significativo apenas sevocê está visualizando a macro nesse contexto. Ele é interpretado se você estiver visualizando o modelo que contém a macro, mas não se estiver usando a macro. As macros são, em certo sentido, simplesmente copiadas do tempo de execução do modelo que contém a macro para a página que a utiliza, todo o espaço para nome vem do modelo que usa a macro.
Para pensar de outra maneira: macros não são uma linguagem de escopo. Se fossem, você não seria capaz de ver a macro de outro modelo. O TAL teria que ser imensamente mais complicado, e você teria que pensar em fechamentos e funções.
Os idiomas "macro" são chamados assim porque as macros são expandidas quando usadas. Eles não são funções.
Então, por que conter modelos inclui contextopara as macros? Eles não precisam. Geralmente é feito para que a macro possa ser testada em um ambiente realista. (Embora algumas vezes as macros estejam dentro de páginas que sejam úteis independentemente.)