2009-05-20 19 views
17

Lo que me pregunto es si hay una manera más fácil/mejor para manejar formularios dinámicos (agregando elementos de formulario al dom vía js) cuando se usan formularios SpringMVC y Spring.¿mejor forma para formas dinámicas con Spring?

Imaging que tiene un objeto de factura que tiene muchos LineItems.

public class Invocie { 
    private List LineItems; 

    public Invoice() { 
     lineItems = ListUtils.lazyList(new ArrayList<LineItem>(), FactoryUtils.instantiateFactory(LineItem.class)); 
    } 
} 

para mostrar los elementos que pertenecen a una factura que actualmente utilizar

<forEach items="${invoice.lineItems}" varStatus="i"> 
    <form:input path="lineItems[${i.index}].productName" /> 
</c:forEach> 

Para añadir ArtículosLínea Tengo algunos js que calcula el nuevo índice y añade que al DOM. Al eliminar un LineItem, actualmente tengo que renumerar todos los índices y esa es la parte que me gustaría evitar, ¿es posible?

+0

Ok Odio decirlo, pero ¿no hay forma de que un controlador de primavera acepte lo que PHP acepta, me refiero a poner [] en el camino? – yglodt

Respuesta

3

Usted podría utilizar los siguientes

public class InvoiceController extends SimpleFormController { 

    protected void initBinder(HttpServletRequest request, ServletRequetDataBinder binder) throws Exception { 
     binder.registerCustomEditor(List.class, "lineItems", new CustomCollectionEditor(List.class)() { 
      protected Object convertElement(Object lineItem) { 
       LineItem li = (LineItem) lineItem; 

       // StringUtils is a jakarta Commons lang static class 
       return (StringUtils.isBlank(li.getProductName())) ? null : li; 
      } 

     }); 
    } 

} 

A continuación, en el método onBind, se quita referencias nulas de acuerdo a:

protected void onBind(HttpServletRequest request, Object command, BindException bindException) throws Exception { 
    Invoice invoice = (Invoice) command; 

    invoice.getLineItems().removeAll(Collections.singletonList(null)); 
}  

Saludos,

+0

Caminan juntos. Esta pregunta no era realmente un problema, me pregunto si hay una manera mejor que lazyList de apache commons. –

1

he encontrado que también decorar con una GrowthList es necesario para evitar algunos errores al agregar/configurar elementos en JSP. (También creó una impl. SpringList personalizada que básicamente hace la decoración doble.)

lineItems = GrowthList.decorate(ListUtils.lazyList(new ArrayList<LineItem>(), FactoryUtils.instantiateFactory(LineItem.class))); 

Estoy de acuerdo. El problema es, sin duda, eliminar elementos.

Lo que puede hacer es utilizar la sintaxis spring marker en el html. Así que si se quita un elemento (en el índice 2, por ejemplo) de la lista usando javascript, que luego marcaría ese índice con:

<input type="hidden" name="_lineItems[2]"> 

Luego, cuando se envía el formulario de primavera verá el marcador y puso en un vacío artículo (basado en la fábrica de lazylist) para lineItems 2 en lugar de ignorarlo.

1

He estado luchando con este problema hoy en día y la cuenta de alguna solución descrita here.

Cuestiones relacionadas