2012-10-16 81 views
2

我正在JSF中創建我的第一個複合組件,但我被一個行爲奇怪的重新渲染難住了。下面是組件實現(它的意思是一個彈出窗口):JSF重新渲染複合組件:insertChildren問題

<composite:implementation> 
    <h:outputScript name="nb-popup.js" library="js"/> 
    <h:outputStylesheet name="nb-popup.compiled.css" library="style"/> 
    <div id="#{cc.clientId}_container" class="nb_popup_container"> 
     <div style="width:#{cc.attrs.width};height:#{cc.attrs.height};" id="#{cc.clientId}" class="nb_popup"> 
      <div id="#{cc.clientId}_header" class="nb_popup_header"> 
       <span class="nb_popup_header_content"> 
        <composite:renderFacet name="header"/> 
       </span> 
       <span class="nb_popup_header_controls"> 
        <composite:renderFacet name="controls"/> 
       </span> 
      </div> 
      <div id="#{cc.clientId}_content" class="nb_popup_content"> 
       <composite:insertChildren/> 
      </div> 
     </div> 
    </div> 
    <script>popup('#{cc.clientId}');</script> 
</composite:implementation> 

例如,讓我們說我們有:

<nb:popup id="extract"> 
    test 
</nb:popup> 

生成的HTML是OK:

<div id="extract_container" class="nb_popup_container"> 
     <div style="width:auto;height:auto;" id="extract" class="nb_popup"> 
      <div id="extract_header" class="nb_popup_header"> 
       <span class="nb_popup_header_content"> 
       </span> 
       <span class="nb_popup_header_controls"> 
       </span> 
      </div> 
      <div id="extract_content" class="nb_popup_content"> 
       test 

      </div> 
     </div> 
    </div> 

現在假設我有一個按鈕:

<h:commandLink value="reload"> 
     <f:ajax render=":extract"/> 
    </h:commandLink> 

按下它之後,我得到了下面的部分響應,其中實際內容顯然不是它應該是:

<div id="extract_container" class="nb_popup_container"> 
     <div style="width:auto;height:auto;" id="extract" class="nb_popup"> 
      <div id="extract_header" class="nb_popup_header"> 
       <span class="nb_popup_header_content"> 
       </span> 
       <span class="nb_popup_header_controls"> 
       </span> 
      </div> 
      <div id="extract_content" class="nb_popup_content"> 
      </div> 
     </div> 
    </div> 
    <script>popup('extract');</script> 
    test 
]]> 

現在假設我移動insertChildren到頁眉:

  <div id="#{cc.clientId}_header" class="nb_popup_header"> 
       <span class="nb_popup_header_content"> 
        <composite:renderFacet name="header"/> 
       <composite:insertChildren/> 
       </span> 
       <span class="nb_popup_header_controls"> 
        <composite:renderFacet name="controls"/> 
       </span> 
      </div> 

初始負載再次是因爲它應該是:

  <div id="extract_header" class="nb_popup_header"> 
       <span class="nb_popup_header_content"> 
     test 

       </span> 
       <span class="nb_popup_header_controls"> 
       </span> 
      </div> 

但在重新加載內容再次感動:

  <div id="extract_header" class="nb_popup_header"> 
       <span class="nb_popup_header_content"> 
       </span> 
       <span class="nb_popup_header_controls"> 
    test 

       </span> 
      </div> 

任何想法可能會導致這個看起來隨機放置insertChildren之後ajax重新渲染?

+0

?你嘗試過最新的? – BalusC

+0

我使用2.1.8,但升級到2.1.13,問題依然存在。有許多問題與切線有關並且仍然是開放的(見答案) – nablex

回答

5

正如BalusC在評論中所建議的那樣,在h:panelGroup中包裝cc:insertChildren似乎可行。例如這個工程:

  <div id="#{cc.clientId}_content" class="nb_popup_content"> 
       <h:panelGroup> 
        <composite:insertChildren/> 
       </h:panelGroup> 
      </div> 

這讓我保留在複合材料部件的樣式和js(與目標=「頭」),所以總體來說是一個更好的解決方案。


這是由於outputStylesheet和outputScript標記導致的Mojarra中的一個錯誤。如果你添加target =「head」,你會得到實際的IndexOutOfBoundExceptions。沒有目標,它只是在回傳上做些奇怪的事情。

當前的解決方案是在主應用程序中包含樣式表和腳本。這部分否定了組合的簡單重用性。

相關未決問題:

什麼鑽嘴魚科的版本是您使用