Dlaczego zmienna jest zdefiniowana poza fill-slot
lub define-macro
element niewidoczny w tym elemencie?
<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>
Wyrażenie opowieści ze zmienną a
nie można ocenić. Oczywiście b
jest widoczny.
Z drugiej strony, jeśli zmienna c
jest zdefiniowany w elemencie zamykającym define-slot
jak poniżej, to jest widoczne.
<div tal:define="c string:c">
<metal:text define-slot="content-core"></metal:text>
</div>
Wygląda na to, że zmienne są oceniane dopiero po wstawieniu szczeliny.
Odpowiedzi:
6 dla odpowiedzi № 1Kontekst makra TAL ma znaczenie tylko wtedy, gdyprzeglądasz makro w tym kontekście. Jest interpretowany, jeśli przeglądasz szablon zawierający makro, ale nie, jeśli używasz makra. Makra są - w pewnym sensie - po prostu kopiowane w czasie wykonywania z szablonu zawierającego makro na stronę, która go używa, następnie rozwinięty. Cała przestrzeń nazw pochodzi z szablonu, który używa makra.
Aby pomyśleć o tym w inny sposób: makra nie są językiem o zasięgu. Gdyby tak było, nie zobaczyłbyś makra w ogóle z innego szablonu. TAL musiałby być znacznie bardziej skomplikowany i musiałbyś myśleć o zamknięciach i funkcjach.
Języki „makr” są nazywane tak, ponieważ makra są rozszerzane, gdy są używane. Nie są funkcjami.
Dlaczego więc zawierają szablony zawierają kontekstw ogóle dla makr? Nie muszą. Zwykle robi się to, aby makro można było przetestować w realistycznym środowisku. (Chociaż czasami makra znajdują się na stronach, które są niezależnie przydatne).