2011-04-21 72 views
0

我想使用動態ui:include,就像這樣。動態<ui:include>不起作用

<ui:repeat value="#{FormsService.getTemplates(component.form)}" 
       var="template"> 
    <ui:include src="forms/#{template.id}.xhtml"/> 
</ui:repeat> 

不知何故,這總是導致包含「forms/.xhtml」,就好像#[template.id}是空的。 但我知道#{template.id}不是空的。即只是把它打印出來就能給我預期的價值。那麼這裏出了什麼問題?任何幫助表示讚賞。

回答

1

這些標籤有點令人困惑,因爲< ui:重複>作爲UIComponent實現,< ui:包含>邏輯位於TagHandler中。構建組件樹時(例如在restoreView階段中),會添加一個UIRepeat組件,但#{template.id}不會正確評估。它不會進行評估,因爲UIRepeat變量「模板」僅在組件處理期間可用,而不在樹構建期間可用。

你有兩個選擇。首先可以使用< c:for each >而不是< ui:重複>。這是一個簡單的解決方案,可能會適合你。它有一個小缺點:如果你有多個相同模板的出現,組件樹將包含每個事件的模板組件的單獨副本。因此內存和CPU性能都會受到影響。

另一種選擇是使用真正的動態包含組件。不幸的是,我沒有找到一個可用。我設法實現這樣的組件,但它不是一個非常方便的解決方案,因爲它還需要稍微修改UIRepeat版本。我們不得不採用這種方法,因爲< c:forEach >的性能損失對我們來說太重了。

+0

不適用於我。我認爲這是因爲整個部分已經嵌套在一個facelet中,並且這似乎會導致一些問題,如果您嘗試將JSTL與它一起使用。所以我也會對你的解決方案感興趣。提前謝謝了。 – AyaProgram 2011-05-02 08:09:25

+0

我已經把代碼放在horus.pl/DynamicInclude.zip – mrembisz 2011-05-04 13:17:43

+0

非常感謝。 – AyaProgram 2011-05-05 07:31:13