2011-11-22 7 views
5

Desidero aggiungere componenti Primefaces dinamicamente. Sto usando soluzione simile a this one, che è stata discussa lì prima:Aggiunta dinamica di componenti Primefaces

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

ma c'è problema con esso. Non v'è esempio di rispondere ottengo dopo pulsante "Aggiungi categoria" è stato cliccato:

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

Grazie in anticipo

+0

Come ho trovato [lì] (http://code.google.com/p/primefaces/issues/detail?id=1568), 'p: column' deve essere aggiunto, ma il problema con ajax esiste ancora – nikagra

+0

Si prega di inviare la soluzione come risposta (che è possibile accettare in seguito te stesso). – oers

+0

Sì, ovviamente) – nikagra

risposta

2

Il problema era con il mio fagioli. Per ottenere l'articolo selezionato, ho dovuto implementare l'implementazione personalizzata dell'interfaccia javax.faces.Converter. A mio parere è abbastanza lavoro da fare per un problema così semplice (questo convertitore deve essere in grado di avere accesso alla fonte di dati e così via). Così ho fatto un piccolo trucco:

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 
} 

e la corrispondente porzione di codice pagina ora assomiglia:

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

preghiamo quindi di prestare la vostra attenzione sulle itemValue attributi e metodi di accesso che vengono visualizzati. Il bug che avevo era sbagliato tipo restituito.

Concludendo, l'unico problema con l'aggiunta dinamica di nuovi componenti Primefaces nel mio caso era la restituzione del valore selezionato. È possibile implementare un convertitore o utilizzare un trucco simile.

È un trucco del genere una buona soluzione secondo te?

+0

Se questo è il tuo codice finale, allora non sembra buono e il tuo trucco non è un buon trucco. Perché, se dai un'occhiata a 'value =" # {categoryBean.selectedCategory} "' e this 'itemValue =" # {category.id} "', sembra confuso. Penso che sia una buona pratica usare un convertitore in questo caso. –

+0

Tnx, sto usando il convertitore, c'era una pace temporanea del codice – nikagra