2012-07-03 63 views
0

我正在從JSF1.2/MyFaces + Facelets向JSF2.1/MyFaces遷移應用程序。我有以下模板,曾用於JSF1.2/MyFaces + Facelets。從JSF1.2 + Facelets遷移到JSF2「具有重複ID的組件」問題

<ui:component> 
<f:subview id="#{id}"> 
. 
. 

<script 
function blockLinkClicks(){ 
    //Disables all the HyperLink Controls to prevent repeated submits 
    var allLinks = document.getElementById("#{id}:treeNodeForm").getElementsByTagName('a'); 
    var count = allLinks.length; 
. 
. 
</script> 
. 
. 
. 
<h:form id="treeNodeForm"> 
    <h:panelGroup id="treePanelId"> 
     <t:tree2 id="tree2Id" 
      value="#{treeBean.treeModel}" var="node" varNodeToggler="t" 
      binding="#{treeBean.component}" clientSideToggle="false" showNav="false"> 
      <f:facet name="selectableNode"> 
       <h:panelGrid id="tree2PGridSelNodeId" columns="3" cellpadding="0" cellspacing="0" border="0"> 
. 
. 
. 

遷移後,我收到以下錯誤:

java.lang.IllegalStateException:組件與副本ID 「mainLeftTree:treeNodeForm:tree2Id:tree2PGridSelNodeId」 在org.apache.myfaces發現 .view.facelets.compiler.CheckDuplicateIdFaceletUtils.checkIds(CheckDuplicateIdFaceletUtils.java:100) 在org.apache.myfaces.view.facelets.compiler.CheckDuplicateIdFaceletUtils.checkIds(CheckDuplicateIdFaceletUtils.java:116)

我在這裏發現了類似的問題,但我無法將解決方案與上述問題聯繫起來。我試圖找到許多天/小時的解決方案,但不能。

請幫助您的建議和指針,我可以嘗試修復,因爲我不確定問題是否與f:subview或t:tree2或jsf2 facelets。

非常感謝您提前。

Regards, Kumar。

回答

1

我認爲這個問題是由於使用了<f:subview id="#{id}>"而造成的,當啓用PSS時這顯然會中斷,因爲每次構建視圖時都會評估EL。首先嚐試將web配置參數javax.faces.PARTIAL_STATE_SAVING設置爲false。或者,您可以使用config參數javax.faces.FULL_STATE_SAVING_VIEW_IDS指示哪些視圖需要完整狀態保存。也許在ID中避免使用EL是一個好主意,並在該部分使用其他策略,但這可能需要對邏輯進行一些更改。

+0

非常感謝您的時間和出色的建議。將javax.faces.PARTIAL_STATE_SAVING設置爲false即可。我以上述方式在10多頁中使用子視圖和EL。如果可能,請幫助策略避免子視圖ID中的EL。複合組件是一種備用解決方案嗎?如果是的話,我能夠在複合組件定義中使用Javascript,就像我在上面的代碼中使用的那樣(即,通過id獲取元素)? – Kumar

+1

我認爲將所有東西都包裹到複合組件中會更好。使用#{id},您可以使用#{cc.clientId},並通過該更改,您可以再次啓用PSS。畢竟,複合材料部件背後的意圖之一是在這種情況下(但並非所有情況下)取代facelets模板。 – lu4242

+0

非常感謝你。這是非常有用的信息。 – Kumar