2012-08-08 105 views
9

你好freemarkers大師freemarker的功能VS宏

我明白freemarker的函數和宏之間的區別是,宏可以打印到輸出,但不能返回值,而函數可以返回值,但不能打印到輸出。

嗯,我有一個問題,因爲我需要同時打印和返回值:

我做遞歸樹的探索與freemarker的,所以我有一個宏被稱爲recurvively。在探索樹時,我需要將節點信息打印到輸出,還需要計算並返回有關所探測節點的統計信息(例如探索節點的特定屬性的總和)

如果我使用宏被反覆調用,我可以打印節點信息但不能將統計數據返回給主叫實體。

如果我使用遞歸調用的函數,我可以返回統計信息,但不能在輸出上打印節點信息。

一個解決方案可能是兩次探索樹,一次是打印節點信息,另一個是收集統計信息,但我討厭使用這種不合理的解決方案。

有人可以提出更好的解決方案嗎?

感謝

回答

0

可以存儲在非#local變量的統計信息。像宏這樣做<#assign treeStats = ...>,然後調用點:

<#import my="myutils.ftl"> 
... 
<@my.tree input /> 
<#assign stats = my.treeStats /> <#-- or whatever you want with my.treeStats --> 

啊,這是尷尬,但FreeMarker的沒有出PARAMS返回二級結果。其實,你可以做循環變量一個黑客,但它也許是太混亂,再加上如果你真的需要一個身體,你不能用這一招:

<@my.tree input; res><#assign stats = res></@> 
1

或者你甚至可以使用全局變量存儲爲您的統計:

<#global stats = [] /> 

<#-- then when you call your function --> 
<#assign = method() /> 

<#function method param = ""> 
    <#-- do something and before you return you push the stats to the global variable, if you choose my approach of "merging" sequences, be careful that you wrap the new stats item also in a sequence or it will fail miserably =) --> 
    <#global stats = stats + [{"statvar1": 10, "statvar2": 30}] /> 

    <#return whateveryoulike /> 
</#function>