2009-05-20 8 views
17

Zastanawiam się, czy istnieje łatwiejszy/lepszy sposób obsługi formularzy dynamicznych (dodawanie elementów formularza do strony poprzez js) podczas korzystania z formularzy SpringMVC i Spring?lepszy sposób na dynamiczne formy ze sprężyną?

Obrazowanie mające faktury obiekt, który ma wiele LineItems.

public class Invocie { 
    private List LineItems; 

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

aby pokazać elementy należące do fakturę Używam obecnie

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

Aby dodać LineItems Mam kilka js, który oblicza nowy indeks i dodaje, że do DOM. Usunięcie elementu LineItem i obecnie wymaga ponownej numeracji wszystkich indeksów i jest to część, której chciałbym uniknąć, czy jest to możliwe?

+0

OK Nienawidzę tego mówić, ale czy nie ma sposobu, aby Wiosenny Kontroler zaakceptował to, co PHP akceptuje, mam na myśli umieszczenie [] na ścieżce? – yglodt

Odpowiedz

3

Można użyć następujących

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

     }); 
    } 

} 

Następnie w metodzie onBind, usunąć referencje zerowe według:

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

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

Pozdrawiam,

+0

Idą razem. To pytanie nie było tak naprawdę problemem, zastanawiam się, czy istnieje lepsza metoda niż leniweList od Apache commons. –

1

Odkryłam, że również zdobienia z GrowthList jest niezbędny, aby uniknąć błędów przy dodawaniu/ustawianiu elementów w JSP. (Utworzono również niestandardową implikację SpringList, która zasadniczo tworzy podwójną dekorację).

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

Zgadzam się. Problem polega oczywiście na usuwaniu przedmiotów.

Co można zrobić, to użyć składni spring marker w html. Więc jeśli usunąć element (o indeksie 2 na przykład) z listy przy użyciu JavaScript, byś potem zaznaczyć, że wskaźnik z:

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

wtedy, gdy formularz jest składany wiosna będzie widać znacznik i umieścić w pustym element (oparty na fabryce lazylist) dla lineItems 2 zamiast go ignorować.

1

mam zmaga się z tym problemem już dziś i zorientowali się jakieś rozwiązanie opisane here.