2016-03-21 71 views
1

假設我在pebble或freemarker(我正在考慮使用的兩個引擎)中都有一個模板。它可能是這個樣子:對Pebble/Freemarker變量/插值的懶惰評估

<Node> 
    <Element attribute="{{ VAR_A }}"/> 
    <Element attribute="{{ VAR_F }}"/> 
    <Element attribute="{{ VAR_N }}"/> 
</Node> 

在我的Java代碼,我將需要提供包含這些變量的,我相信可以只是地圖變量名的兩個引擎對象的對象。

但是爲了生成數據模型,我需要知道要爲哪些變量計算值。我有很多數據。我不想計算所有的VAR_A,VAR_B,VAR_C,VAR_D,VAR_E等,如果他們不會被使用。

在執行模板之前,在這些引擎中是否有一種方法可以獲取所需變量的列表?一種方法來做每個屬性值的延遲評估

編輯:我不知道當我必須評估它,因爲它將由用戶定義模板將看起來像。即使他們提供的變量將是用戶定義的字符串 - 這就是爲什麼我需要(並分析)他們,然後才能提供數據。

+0

你問你的模型是否可以做屬性值的懶惰評估? – Raedwald

+0

基本上,是的。 – AdamBourke

回答

0

您使用Freemarker生成的每種文檔都有自己的模板。每個模板都會有一個設置,如果它使用了變量。在您的Java代碼中,您提供了一個將變量名稱映射到值的Map。如果您有與每個模板對應的不同Java方法,那麼這些方法可以爲該模板設置最小的所需映射。那張地圖不一定是HashMap;理論上你可以編寫你自己的Map接口的實現,它在其getvalues(etc)方法中做了懶惰評估。但這幾乎肯定比它的價值更麻煩。您提供的地圖中的值不需要是String對象; Freemarker將使用每個對象的toString方法,這提供了一種懶惰的評估。

+0

在這種情況下,我不會事先知道模板的樣子,並且每個用戶可能會有所不同。模板中的變量將由用戶定義,因此無論如何我需要查看它們中的每一個。如果需要,我可以重寫HashMap - 但我希望有一種方法可以預先評估模板以獲取變量列表。 – AdamBourke

+0

這沒有任何意義。如果tempkates是用戶定義的,則用戶正在對系統進行編程,而不是您。你不想這樣做。 – Raedwald

+0

該軟件爲用戶提供了大量的自定義功能。這個想法是,他們可以編寫自己的模板,我們將在系統中填充數據。他們使用的變量將在系統中的其他地方定義。這是我們想要做的。 – AdamBourke