2012-01-04 15 views
5

Estoy usando el componente del asistente Primefaces. En una pestaña estoy creando dinámicamente cuadros de entrada basados ​​en la entrada de pestañas anteriores (tipo de usuario). Las etiquetas de texto de la casilla de entrada se derivan de una lista. En mi bean de respaldo, tengo un mapa que contiene etiquetas de entrada como claves y entradas de entrada como valores.Cómo puedo vincular valores de una casilla de entrada a un valor de mapa en una propiedad de bean de respaldo cuando uso un asistente

Al hacer clic en siguiente, me gustaría que el mapa (valores) que se actualizan con la entrada del usuario (que corresponde a la tecla)

<c:forEach items="#{gdsiGeodataBean.actionCommand.fields}" var="reqs"> 
    <h:outputLabel for="#{reqs.name}" value="#{reqs.name}:* " /> 
    <pou:inputText value="#{gdsiGeodataBean.actionCommand.values['reqs.name']}" required="true" requiredMessage="Input is required."/> 
</c:forEach> 

Mi respaldo de frijol:

private List<RequiredParam> fields; // +getter (no setter required) 
private Map<String, String> values; // +getter (no setter required) 

public CommandAction(String actionName, String actionParams, String context) { 
    this.actionName = actionName; 
    this.actionParams = actionParams; 
    this.contextName = context; 

    //Set up parameters 
    getRequiredParams(); 
    getOptionalParams(); 
    fields = getFields(); 
    values = new HashMap<String, String>(); 
} 

Esencialmente lo que gustaría que los valores del mapa se actualicen con las entradas del usuario de los cuadros de entrada de texto.

+0

Como puede ver, estaba siguiendo este ejemplo http://stackoverflow.com/questions/7010256/how-to-dynamically-build-a-back-bean-edit-form – algone

+0

Pruebe agregar un evento FlowListener en su bean administrado y verifique si los valores en su mapa se están actualizando en el servidor: 'flowListener =" # {managedBean.onFlowListener} '. Si esto no ocurre, verifique que no esté recibiendo ninguna excepción o validación errores durante la fase de Validación de la devolución. –

+0

@maple_shaft Ya lo tengo en mi opinión. algone

Respuesta

12

Su enfoque para vincular el valor de entrada a un mapa no es del todo correcto.

<pou:inputText value="#{gdsiGeodataBean.actionCommand.values['reqs.name']}" required="true" requiredMessage="Input is required."/> 

Estás especificar una clave del mapa fijo en lugar de una clave del mapa dinámico basado en la actualidad iterado #{reqs}. De esta forma, todos los valores enviados terminarán en una y la misma clave de mapa fijo "reqs.name", por lo que cada una se anula entre sí para que solo obtenga el valor del último campo en el mapa.

Debe eliminar esas comillas simples para que sea una clave realmente dinámica.

<pou:inputText value="#{gdsiGeodataBean.actionCommand.values[reqs.name]}" required="true" requiredMessage="Input is required."/> 

Sin relación a la cuestión concreta, a pesar de que este enfoque funciona cuando se utiliza tal cual en su pregunta, la <c:forEach> se producirá un error en ciertas circunstancias. P.ej. cuando se usa dentro de un componente compuesto o un componente iterativo JSF. Más bien use <ui:repeat> en su lugar. Consulte también JSTL in JSF2 Facelets... makes sense?

+1

¿No sería necesario que 'actionCommand.values' requiera que getter y setter sean verdaderamente una propiedad vinculada? El OP no mostró esto en su código, pero lo estoy preguntando porque realmente no sé, nunca he usado el componente 'c: forEach' antes. –

+2

@maple_shaft: solo se requiere un getter 'getValues ​​()'. Un colocador es innecesario en mapas/listas. JSF EL establecerá el valor en el mapa/lista obtenido mediante la clave/índice dado por EL. De la misma manera: 'gdsiGeodataBean.getActionCommand(). GetValues ​​(). Put (reqs.getName(), newValue)'. Esto es independientemente de si está dentro de '', '', etc. – BalusC

+0

Gracias por esa explicación, ¡tiene sentido ahora! –

Cuestiones relacionadas