2012-05-28 15 views
7

Ecco lo scenario (semplificato):Utilizzando <ui:repeat><h:inputText> su un elenco <String> non aggiorna modello valori

C'è un fagiolo (chiamarlo mrBean) con un membro e le opportune getter/setter:

private List<String> rootContext; 

public void addContextItem() { 
    rootContext.add(""); 
} 

Il codice JSF:

<h:form id="a_form"> 
      <ui:repeat value="#{mrBean.stringList}" var="stringItem"> 
        <h:inputText value="#{stringItem}" /> 
      </ui:repeat> 
      <h:commandButton value="Add" action="#{mrBean.addContextItem}"> 
       <f:ajax render="@form" execute="@form"></f:ajax> 
      </h:commandButton> 
</h:form> 

Il problema è che quando si clicca il pulsante "Aggiungi", i valori che erano ente rosso nel <h:inputText/> che rappresentano le stringhe nel stringList non vengono eseguite.

In realtà, il setter mrBean.stringList (setStringList(List<String> stringList)) non viene mai chiamato.

Qualche idea del perché?

Alcune informazioni - sto usando MyFaces JSF 2.0 su Tomcat 6.

risposta

20

La classe String è immutabile e non dispone di un setter per il valore. Il getter è fondamentalmente il metodo Object#toString().

È necessario ottenere/impostare il valore direttamente su List. È possibile farlo dall'indice di lista che è disponibile per <ui:repeat varStatus>.

<ui:repeat value="#{mrBean.stringList}" varStatus="loop"> 
    <h:inputText value="#{mrBean.stringList[loop.index]}" /> 
</ui:repeat> 

Non è necessario un setter per il stringList. EL riceverà l'articolo List#get(index) e imposta l'articolo List#add(index,item).

+0

Grazie! Ho capito che il problema era che i valori erano immutabili, ma non sapevo se JSF potesse in qualche modo superare questo problema. Questo spiega davvero così grazie. – Ben

+0

Prego. – BalusC

+0

Quindi, loop.index qui restituisce l'indice dell'elemento corrente della lista? – user3663882