2013-10-07 66 views
2

由於性能問題,我正在將一些組合標記遷移到自定義標記。使用組合時,所有的ID都可以正確生成,但是當使用自定義標籤時,我有重複的Id異常,即使我創建了一個自定義EL表達式來生成新的ID。嵌套標記時JSF自定義標記上的重複ID

經過一番研究,現在看來,這是因爲嵌套的標籤時,標籤的屬性繼承:

<far:fcontainer name="**father1**" type="panel"> 
<far:fcontainer type="panel"> 
    <far:fcontainer type="panel">child 3</farTag:fcontainer> 
</far:fcontainer> 
</far:fcontainer> 

在這個例子中,第一fcontainer應該有ID father1和嵌套的人應該有ID生成的,但是這是我有:

<div id="**father1**" class="ui-widget-content"> 
<div id="**father1**" class="ui-widget-content"> 
    <div id="**father1**" class="ui-widget-content">child3</div> 
</div> 
</div> 

自定義標籤:

<ui:composition> 
    <p:outputPanel layout="block" styleClass="#{type == 'panel'?'ui-widget-content':''}" 
     id="#{empty name ? far:generateId() : name}"> 
     <ui:insert /> 
    </p:outputPanel> 
<ui:composition> 

這是正常的嗎?有什麼解決方法嗎?

經測試Mojarra 2.1.26。

在此先感謝。

更新:在MyFaces 2.1.12上測試,似乎工作正常,莫哈拉的錯誤?

+1

在MyFaces中,有一個很大的修復了id生成算法,使它更具可預測性和獨特性,並且以這種方式更加穩定。這是一個很長的故事,那裏有很多艱苦的工作,但在我看來,這是目前爲止這個問題的最佳解決方案。看起來Mojarra仍然有舊的Facelets 1.1.x算法,我想你在Mojarra看到的合成器是由MyFaces 2.2.x引起的,它發現了該算法的一些重要缺陷,並記得Facelets代碼也被捐贈給了MyFaces ,所以這兩個實現最初在那裏使用相同的代碼。 – lu4242

+0

您可以在生成的標記之前連接一些單詞?你試過了嗎? –

回答

0

解決此問題的方法是始終使用自定義EL表達式,並且在其中可以首先檢查父組件是否具有屬性集。