2009-05-20 10 views
17

Was ich frage mich, wenn es eine leichtere/bessere Möglichkeit gibt, dynamische Formulare (Hinzufügen von Formularelementen zum Dom über js) bei der Verwendung von SpringMVC und Spring-Formulare?besserer Weg für dynamische Formen mit Spring?

Imaging mit einem Rechnungsobjekt, das viele LineItems hat.

public class Invocie { 
    private List LineItems; 

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

die Elemente anzuzeigen, zu einer Rechnung gehören, zur Zeit verwende ich

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

Lineitems hinzuzufügen habe ich einige js, die den neuen Index berechnet und fügt hinzu, dass auf das DOM. Wenn ich ein LineItem lösche, muss ich jetzt alle Indizes neu nummerieren, und das ist der Teil, den ich vermeiden möchte, ist das möglich?

+0

Ok ich hasse es zu sagen, aber gibt es keine Möglichkeit, einen Spring Controller zu akzeptieren, was PHP akzeptiert, ich meine, [] in den Pfad zu setzen? – yglodt

Antwort

3

Sie könnten die folgenden

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; 
      } 

     }); 
    } 

} 

Dann in onBind Methode verwenden, Sie null Verweise entfernen nach:

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

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

Grüße,

+0

Sie gehen zusammen. Diese Frage war nicht wirklich ein Problem, ich frage mich, ob es einen besseren Weg gibt als die LazyList von Apache Commons. –

1

ich gefunden habe, dass auch mit einer Dekoration GrowthList ist notwendig, um Fehler beim Hinzufügen/Setzen von Elementen in JSP zu vermeiden. (Auch eine benutzerdefinierte SpringList-Impl., Die im Grunde die doppelte Dekoration erstellt.)

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

Ich stimme zu. Das Problem besteht sicherlich darin, Gegenstände zu entfernen.

Was Sie tun können, ist die spring marker Syntax im HTML verwenden. Also, wenn Sie ein Element entfernen (bei Index 2 zum Beispiel) aus der Liste mit Hilfe von Javascript, würden Sie dann markieren, dass Index mit:

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

Dann, wenn die Formfeder den Marker vorgelegt und legte in einem leeren sehen Artikel (basierend auf der Lazylist-Fabrik) für LineItems 2 statt es zu ignorieren.

11

Ich habe ein Tutorial implementiert, das Ihnen helfen könnte, dies zu lösen, indem Sie jQuery auf der Client-Seite und Springs AutoPopulating-Liste für Ihre Backing-Objekte verwenden.

http://eggsylife.co.uk/2009/11/30/spring-forms-dynamic-lists-and-ajax/

EDIT Link von WebArchive https://web.archive.org/web/20160729163958/http://eggsylife.co.uk/2009/11/30/spring-forms-dynamic-lists-and-ajax/

+0

@ egsy84 Wie wäre es, Objekte dynamisch zu entfernen? – Erlan

1

ich mit diesem Problem zu kämpfen heute habe und dachte einige Lösung here beschrieben werden.