2012-10-16 2 views
2

Я делаю свой первый составной компонент в JSF, но я в тупик от ревердера, который ведет себя странно. Вот реализация компонента (это означает, что всплывающее окно):Комбинированный компонент JSF Rerender: 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 ОК:

<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 rerender?

+0

Что Mojarra версии вы используете? Вы пробовали последнее? – BalusC

+0

Я использовал 2.1.8, но обновлялся до 2.1.13, и проблема не устранена. Существует ряд вопросов, связанных касательно и до сих пор открытых (см. Ответ) – nablex

ответ

5

Как было предложено BalusC в комментарии, обертка cc: insertChildren в h: panelGroup работает. Например, это работает:

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

Это позволяет мне сохранить стиль и JS в композитном компоненте (с целевой = «голова»), так что в целом это гораздо лучшее решение.


Это ошибка в Мохарре из-за выходных символов и символов outputScript. Если вы добавите target = "head", вы получите фактическое значение IndexOutOfBoundExceptions. Без цели он просто делает странные вещи на postbacks.

Текущее решение состоит в том, чтобы включать таблицы стилей и сценарии в основное приложение. Это частично исключает возможность повторного использования композита.

Связанные открытые вопросы:

Смежные вопросы