2011-11-22 26 views
5

Quiero agregar componentes de Primefaces dinámicamente. Estoy usando solución similar a this one, que se discutió allí antes:Agregar componentes de Primefaces dinámicamente

<h:form> 
    <h:panelGrid columns="2"> 
     <p:dataGrid id="categoriesGrid" value="#{bean.categories}" 
      var="categoryBean" rowIndexVar="rowIndex"> 
      <p:column> 
       <p:selectOneMenu id="categorySelect" effect="drop" 
        value="#{categoryBean.selectedCategory}" > 
        <f:selectItems value="#{categoryBean.availableCategories}" 
         var="category" itemLabel="#{category.name}" 
         itemValue="#{category}" /> 
       </p:selectOneMenu> 
      </p:column> 
     </p:dataGrid> 
     <p:commandButton actionListener="#{bean.addNewCategory}" 
      value="Add category" update="categoriesGrid"/> 
    </h:panelGrid> 
</h:form> 

Pero hay un problema con él. No es ejemplo de responder recibo después de que se hace clic en el botón "Añadir categoría":

<?xml version='1.0' encoding='UTF-8'?> 
<partial-response> 
<error> 
    <error-name> 
     class javax.faces.component.UpdateModelException 
    </error-name> 
    <error-message> 
     <![CDATA[/createTutorial.xhtml @85,65 value= 
      "#{categoryBean.selectedCategory}":java.util.NoSuchElementException]]> 
    </error-message> 
</error> 
</partial-response> 

Gracias de antemano

+0

Como encontré [allí] (http://code.google.com/p/primefaces/issues/detail?id=1568), debe agregarse 'p: column', pero el problema con ajax aún existe – nikagra

+0

Por favor, publique su solución como una respuesta (que puede aceptar más tarde por su cuenta). – oers

+0

Sí, por supuesto) – nikagra

Respuesta

2

El problema fue con mi frijol. Para obtener el elemento seleccionado, tuve que implementar la implementación personalizada de la interfaz javax.faces.Converter. En mi opinión, es bastante trabajo por hacer para un problema tan simple (este convertidor debe poder acceder a la fuente de datos, etc.). Así que he hecho un pequeño truco:

public class CategoryBean{ 

    private list<Category> availableCategories; 
    private Category selectedCategory; 

    public Long getCSelectedCategory(){ 
     // Get selected category by it's id and set selectedCategory 
    } 

    public void setSelectedCategory(Long selectedCategory){ 
     return selectedCategory.getId(); 
    } 

    // The remaining setters and getters 
} 

y la pieza correspondiente del código de la página ahora se ve así:

<p:column> 
    <p:selectOneMenu id="categorySelect" effect="drop" 
     value="#{categoryBean.selectedCategory}" > 
     <f:selectItems value="#{categoryBean.availableCategories}" 
      var="category" itemLabel="#{category.name}" 
      itemValue="#{category.id}" /> 
    </p:selectOneMenu> 
</p:column> 

Por favor, preste atención a las itemValue atributos y métodos de acceso que se muestran. El error que tuve fue un tipo de devolución de getter equivocado.

Concluyendo, el único problema con la adición de nuevos componentes Primefaces dinámicamente en mi caso fue la devolución del valor seleccionado. Puede implementar convertidor o usar un truco similar.

¿Es ese truco una buena solución en su opinión?

+0

Si este es su código final, entonces no se ve bien y su truco no es un buen truco. Porque, si echas un vistazo a este 'value =" # {categoryBean.selectedCategory} "' y this 'itemValue =" # {category.id} "', parece confuso. Creo que es una buena práctica usar un convertidor en tal caso. –

+0

Tnx, estoy usando convertidor, había una paz temporal de código – nikagra

Cuestiones relacionadas