2014-02-22 79 views
2

爲什麼定義在fill-slotdefine-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是可見的。另一方面,如果變量cdefine-slot的封閉元素中定義,那麼它是可見的。

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

看起來只有在插入插槽後才計算變量。

回答

5

只有在該環境中查看宏時,TAL宏的上下文才有意義。如果您正在查看包含宏的模板,則會解釋它,但如果您使用宏,則不會。宏 - 在某種意義上 - 只是將運行時從包含宏的模板複製到使用它的頁面,然後展開。所有名稱空間都來自使用宏的模板。

想想另一種方式:宏不是範圍內的語言。如果他們是,你將無法從另一個模板中看到宏。 TAL必須非常複雜,你必須考慮關閉和功能。

調用「宏」語言是因爲宏在使用時被擴展。他們不是功能。

那麼,爲什麼包含模板包含宏的上下文呢?他們不需要。通常這樣做是爲了使宏可以在現實的環境中進行測試。 (雖然有時宏是獨立有用的內頁)

+0

Thansk爲澄清答案 – wolfrevo

+0

+1,非常好的解釋 –

相關問題