2012-10-16 50 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。没有目标,它只是在回传上做些奇怪的事情。

当前的解决方案是在主应用程序中包含样式表和脚本。这部分否定了组合的简单重用性。

相关未决问题:

什么钻嘴鱼科的版本是您使用