2014-12-18 2 views
0

I имеет следующую структуру в моем приложении:Динамически генерируемые panelGroup не могут быть расположены

<h:outputLabel value="Regiões :" /> 
<p:autoComplete multiple="true" value="#{investimento.regioesSelecionadas}" 
       completeMethod="#{investimento.completaRegiao}" 
       var="reg" itemLabel="#{reg.label}" itemValue="#{reg}" 
       converter="entityConverter" forceSelection="true"> 

    <p:column> 
     <h:outputText value="#{reg.label}" /> 
    </p:column> 
    <p:ajax event="itemSelect" update="regiaoCol" /> 
    <p:ajax event="itemUnselect" update="regiaoCol" /> 
    <p:ajax event="itemUnselect" listener="#{investimento.tiraUmaRegiao}"/> 
</p:autoComplete> 

<h:outputText /> 
<h:panelGroup id="regiaoCol"> 
    <c:forEach items="#{investimento.regioesSelecionadas}" var="regSel" rendered="#{!investimento.regioesSelecionadas.isEmpty()}"> 
     <h:panelGrid columns="2"> 
      <h:outputLabel value="Região #{regSel.label} - Estados:" /> 
      <p:autoComplete multiple="true" value="#{investimento.estadosSelecionados}" 
          var="est" itemLabel="#{est.label}" itemValue="#{est}" 
          completeMethod="#{investimento.completaEstado}" 
          converter="entityConverter" forceSelection="true" cash="true"> 
       <f:attribute name="regPar" value="#{regSel}" /> 
       <p:column> 
        <h:outputText value="#{est.label}" /> 
       </p:column> 
       <p:ajax event="itemSelect" update="#{investimento.idComposta(est, regSel)}" /> 
       <p:ajax event="itemUnselect" update="regiaoCol" /> 
       <p:ajax event="itemUnselect" update="#{investimento.idComposta(est, regSel)}"/> 
       <p:ajax event="itemUnselect" update="#{investimento.idComposta(est, regSel)}" listener="#{investimento.tiraUmEstado}"/> 
      </p:autoComplete> 

      <h:outputLabel /> 
      <h:panelGroup id="#{investimento.idComposta(est, regSel)}"> 
       <c:forEach items="#{investimento.estadosSelecionados}" var="estSel"> 
        <h:panelGrid columns="2"> 
         <h:outputLabel value="Estado #{estSel.label} - Municipios:    #{investimento.idComposta(est, regSel)}" /> 
         <p:autoComplete multiple="true" value="#{investimento.municipiosSelecionados}" 
             var="mun" itemLabel="#{mun.label}" itemValue="#{mun}" 
             completeMethod="#{investimento.completaMunicipio}" maxResults="8" 
             converter="entityConverter" forceSelection="true" cash="true"> 
          <f:attribute name="estPar" value="#{estSel}" /> 
          <p:column> 
           <h:outputText value="#{mun.label}" /> 
          </p:column> 
         </p:autoComplete> 
        </h:panelGrid> 
       </c:forEach> 
      </h:panelGroup> 
     </h:panelGrid> 
    </c:forEach> 
</h:panelGroup> 

Таким образом, всякий раз, когда я выбираю «Região» будет появляться в «regiaoCol» новые возможности для пользователя, чтобы выбрать. Однако есть проблема: когда я удалить «Região», добавьте его снова и попытаться удалить его еще раз, он вызывает следующее сообщение об ошибке:

> Grave: Error Rendering View[/InsI.xhtml] 
javax.faces.FacesException: Cannot find component with expression "munEst2Reg3" referenced from "form:j_idt190". 
    at org.primefaces.expression.SearchExpressionFacade.resolveComponentInternal(SearchExpressionFacade.java:422) 
    at org.primefaces.expression.SearchExpressionFacade.resolveComponentForClient(SearchExpressionFacade.java:200) 
    at org.primefaces.expression.SearchExpressionFacade.resolveComponentsForClient(SearchExpressionFacade.java:147) 
    at org.primefaces.util.AjaxRequestBuilder.addExpressions(AjaxRequestBuilder.java:92) 
    at org.primefaces.util.AjaxRequestBuilder.update(AjaxRequestBuilder.java:85) 
    at org.primefaces.behavior.ajax.AjaxBehaviorRenderer.getScript(AjaxBehaviorRenderer.java:80) 
    at javax.faces.component.behavior.ClientBehaviorBase.getScript(ClientBehaviorBase.java:103) 
    at org.primefaces.renderkit.CoreRenderer.encodeClientBehaviors(CoreRenderer.java:458) 

который, как я полагаю, вызывается браузер ищет что ссылка, в данном случае «munEst2Reg3», и она не существует. Однако: почему это порождает ошибку? Как это отличается от удаления «Região» в первый раз? Как решить проблему? Должен ли я отправлять страницу после каждого отказа? (Который не было бы наиболее удобный вариант)

+1

Там нет компонента с 'id'' munEst2Reg3' в текущем коде, если вы устанавливаете где-то динамически через EL - 'ID =" # { investimento.idComposta (est, regSel)} ". Вы злоупотребляете ''. Вместо этого вы можете использовать другие итерационные компоненты JSF/PrimeFaces, такие как '', '', '' для того же, в зависимости от ваших требований. – Tiny

+0

Спасибо, человек! Это действительно осветил путь! – RafaelCruz

ответ

0

ответ Тайний поставил меня на правильном пути, и после некоторых отладок я нашел нечто:

  1. Поскольку все экземпляры которых меня- тот же список имеет первостепенное значение что все они имеют событие или один удалит входы другого;
  2. Вы также должны заботиться о том, как ведет себя DataTable и гарантирует, что он получает только интересующие вас значения;

Как мой код в конечном итоге существо:

<h:outputLabel value="Regiões :" /> 
       <p:autoComplete multiple="true" value="#{investimento.regioesSelecionadas}" 
           completeMethod="#{investimento.completaRegiao}" 
           var="reg" itemLabel="#{reg.label}" itemValue="#{reg}" 
           converter="entityConverter" forceSelection="true"> 

        <p:column> 
         <h:outputText value="#{reg.label}" /> 
        </p:column> 
        <p:ajax event="itemSelect" update="regiaoCol" /> 
        <p:ajax event="itemUnselect" update="regiaoCol" listener="#{investimento.tiraUmaRegiao}"/> 
       </p:autoComplete> 

       <h:outputText /> 
       <h:panelGroup id="regiaoCol"> 
        <p:dataTable value="#{investimento.regioesSelecionadas}" var="regSel" rendered="#{investimento.regioesSelecionadas.isEmpty() == false}"> 
         <p:column> 
          <h:outputLabel value="Região #{regSel.label} - Estados:" /> 
         </p:column> 

         <p:column> 
          <p:autoComplete multiple="true" value="#{investimento.estadosSelecionados}" 
              var="est" itemLabel="#{est.label}" itemValue="#{est}" 
              completeMethod="#{investimento.completaEstado}" 
              converter="entityConverter" forceSelection="true"> 
           <f:attribute name="regPar" value="#{regSel}" /> 

           <p:column> 
            <h:outputText value="#{est.label}" /> 
           </p:column> 

           <p:ajax event="itemSelect" update="#{investimento.idComposta()}" > 
            <f:attribute name="regiaoPar" value="#{regSel}" /> 
           </p:ajax> 

           <p:ajax event="itemUnselect" update="#{investimento.idComposta()}" listener="#{investimento.tiraUmEstado}"> 
            <f:attribute name="regiaoPar" value="#{regSel}" /> 
           </p:ajax> 
          </p:autoComplete> 
         </p:column> 

         <p:column> 
          <h:panelGroup id="#{investimento.idComposta()}"> 
           <f:attribute name="regiaoPar" value="#{regSel}" /> 

           <p:dataTable value="#{investimento.meusEstSel()}" var="estSel" rendered="#{investimento.meusEstSel().isEmpty() == false}"> 
            <f:attribute name="regiaoPar" value="#{regSel}" /> 
            <p:column> 
             <h:outputLabel value="Estado #{estSel.label} - Municipios:" /> 
            </p:column> 
            <p:column> 
             <p:autoComplete multiple="true" value="#{investimento.municipiosSelecionados}" 
                 var="mun" itemLabel="#{mun.label}" itemValue="#{mun}" 
                 completeMethod="#{investimento.completaMunicipio}" maxResults="8" 
                 converter="entityConverter" forceSelection="true"> 
              <f:attribute name="estPar" value="#{estSel}" /> 

              <p:column> 
               <h:outputText value="#{mun.label}" /> 
              </p:column> 
              <p:ajax event="itemSelect" /> 
              <p:ajax event="itemUnselect" /> 
             </p:autoComplete> 
            </p:column> 
           </p:dataTable> 
          </h:panelGroup> 
         </p:column> 
        </p:dataTable> 
       </h:panelGroup> 
Смежные вопросы