2012-05-28 8 views
7

Aquí está el panorama (simplificado):<ui:repeat><h:inputText> en una lista de <String> no actualiza modelo de valores

Hay un frijol (llámese mrBean) con un miembro y los getters/setters apropiadas:

private List<String> rootContext; 

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

El código 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> 

El problema es que, al hacer clic en los botones "Añadir", los valores que eran Ente rojo en el <h:inputText/> que representan las cadenas en el stringList no se ejecutan.

En realidad, el setter mrBean.stringList (setStringList(List<String> stringList)) nunca se llama.

¿Alguna idea de por qué?

Algo de información - estoy usando MyFaces JSF 2.0 en Tomcat 6.

Respuesta

20

La clase String es inmutable y no tiene un regulador para el valor. El captador es básicamente el método Object#toString().

Necesita obtener/establecer el valor directamente en el List en su lugar. Puede hacerlo mediante el índice de lista que está disponible en <ui:repeat varStatus>.

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

No necesita un colocador para el stringList tampoco. EL obtendrá el artículo por List#get(index) y establecerá el artículo por List#add(index,item).

+0

Gracias! Pensé que el problema era que los valores eran inmutables, pero no sabía si JSF de alguna manera podría superar esto. Esto realmente lo explica, así que gracias. – Ben

+0

De nada. – BalusC

+0

Entonces, ¿loop.index aquí devuelve el índice del elemento actual de la lista? – user3663882

Cuestiones relacionadas