2012-06-22 4 views
5

Tengo una página que muestra detalles de algunos clientes. Estoy usando t:loop para mostrar algunos datos. En t:loop Estoy pasando source y value. Hasta ahora todo va bien, mi página está funcionando bien. Pero cuando trato de enviar la Página, de repente me da la Excepción.Encóder con <t:loop> componente en Tapiz

“No se pudo encontrar una coerción de tipo java.lang.String para escribir [addressUsageValue] coacciones disponibles:. .........”

A continuación se muestra el código de ejemplo

<t:loop source="addressUsageInfo" value="addressUsageValue"> 
        <tr> 
           <td>${addressUsageValue?.usage}</td> 
           <td>${addressUsageValue?.address}</td> 
           <td>${addressUsageValue?.postCode}</td> 
           <td>${addressUsageValue?.city}</td> 
           <td>${addressUsageValue?.country}</td> 
        </tr> 
</t:loop> 

Hice algunas gafas y encuentro debajo de las referencias.

http://tapestry.apache.org/5.3.3/apidocs/org/apache/tapestry5/corelib/components/Loop.html https://issues.apache.org/jira/browse/TAP5-609

Así que han creado codificador de bucle. A continuación se muestra el código de muestra. En el siguiente método, toClient(), he devuelto aleatoriamente cualquier valor y en el método toValue() devuelvo el valor nulo.

private final ValueEncoder<DtoAddressUsageInfo> addressUssageEncoder = 
    new ValueEncoder<DtoAddressUsageInfo>() { 

    public String toClient(DtoAddressUsageInfo value) { 
      return String.valueOf(value.getUsage()); 
    } 

    public DtoAddressUsageInfo toValue(String clientValue) { 
      return null; 
    } 

}; 

Ahora mi código está funcionando bien y puedo enviar el formulario.

Aquí viene mi duda

Primera - No soy capaz de entender por qué se requiere cuando se utiliza el codificador de bucle ?? Y si se requiere enviar el formulario, ¿por qué no es un parámetro obligatorio?

Segundo: Acabo de implementar el Encoder sin ninguna lógica. No puedo entender dónde se usa el método toValue() y toClient() y cuál es el propósito?

En tercer lugar, cuando presento la página ¿por qué el formulario requiere Encoder?

Respuesta

6

Los parámetros formState y encoder resuelven el siguiente problema: Cuando se envía el formulario, ¿cómo se asegura de que los valores del formulario vayan a los objetos para los que están destinados?

Si la colección que está iterando no cambia entre la representación del formulario y el envío del formulario, la solución más simple es establecer formState="iteration" (explicado muy bien in the docs).

Sin embargo, si la colección puede cambiar entre renderizado y envío, deberá codificar la información sobre qué iteración de bucle es qué objeto. Esto se hace con un ValueEncoder (nuevamente, se explica muy bien en its documentation). Una implementación común podría, por ejemplo, codificar una ID de base de datos en el formulario (toClient()) al representar, y cargar la entidad desde la base de datos cuando se envíe el formulario (toValue()).

Todo esto también se explica bien en el Loop component documentation that you found.

+0

muchas gracias @Henning. Entiendo :) –

1

La respuesta de Henning también me ayudó. El valor de mi ciclo aparecería nulo solo cuando intente configurar una casilla para una fila en mi ciclo. El codificador funciona y los datos aparecen bien.La casilla de verificación se establece con un setter y se recupera con un getter por iteración, por fila. El valor Boolean real vive dentro de un contenedor alrededor del objeto de datos. El bucle recibe una lista de estos objetos de envoltura. Un evento '' onClick 'envía el formulario. Pero por iteración, mi objeto contenedor (valor de ciclo) siempre sería nulo. Agregué formstate = "iteración" y ahora las casillas de verificación mantienen su estado.

<t:loop t:source="treeNodeList" value="treeNode" 
t:encoder="treeNodeEncoder" formState="iteration"> 
    <tr style="text-align:center;"> 
     <td class="table-checkbox" id="data-table-1st-col"> 
     <input t:type="checkbox" value="currentSelectedTreeNode" 
     onclick="this.form.submit();"/> 

    .... 

     </td> 
    </tr> 
</t:loop> 
Cuestiones relacionadas