2015-10-24 47 views
0

FreeMarker如何爲迭代器實現.iterator()?has_content? 它試圖獲得第一個項目來決定是否渲染, 並且它是否保留迭代?或者它開始另一次迭代?FreeMarker?has_content迭代器

我發現這個

static boolean isEmpty(TemplateModel model) throws TemplateModelException 
{ 
    if (model instanceof BeanModel) { 
     ... 
    } else if (model instanceof TemplateCollectionModel) { 
     return !((TemplateCollectionModel) model).iterator().hasNext(); 
     ... 
    } 
} 

但我不知道是什麼Freemarker的包裹Iterator類型。 是TemplateCollectionModel

回答

1

它沒有得到的第一個項目,它只是調用hasNext(),是的,默認ObjectWrapper(見object_wrapper配置設置),它會被當作一個TemplateCollectionModel,可上市雖然只有一次。但在2.3.24之前(我寫這篇文章時未發佈),有一些小問題需要注意(見下文)。此外,如果您使用的是純粹的BeansWrapper而不是默認的ObjectWrapper,則會出現一個故障(請參閱以下內容)。如果您使用的是默認的ObjectWrapper(您應該),並且Iterator不會被重新獲得用於後續列表,也就是說,已重複使用相同的已包裝值,那麼它會嚇壞了告訴Iterator只能列出一次。

毛刺2,純粹的BeansWrapper:它總是會說它有內容,即使Iterator是空的。這也在2.3.24中得到了修復,但是,您需要創建BeansWrapper本身(即,不是(僅)Configuration),並且2.3.24 incompatibleImprovements可以使修補程序處於活動狀態。

請注意,<#list ...>...<#else>...</#list>已經和正在所有情況下工作(甚至在2.3.24之前)。

最後,不是最不重要的,謝謝你將這個話題引起我的注意。因此,我已經在2.3.24中解決了這些問題。 (每晚可以建:https://github.com/apache/incubator-freemarker/tree/2.3-gae

+0

感謝您的詳細解答! '<#list ...><#items as x>'' - 它是否也適用於自引入以來Iterator'?似乎如此,到目前爲止 –

+0

是的,'#items'也可以用'Iterator'-s。 – ddekany