2009-05-20 13 views
17

Ce que je me demande est s'il y a une manière plus facile/meilleure de manipuler des formes dynamiques (en ajoutant des articles de forme au dom via js) en employant des formes de SpringMVC et de ressort?meilleur moyen pour les formes dynamiques avec Spring?

Imagerie comportant un objet Facture comportant plusieurs éléments de ligne.

public class Invocie { 
    private List LineItems; 

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

Pour afficher les éléments appartenant à une facture J'utilise actuellement

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

Pour ajouter LineItems J'ai quelques js qui calcule le nouvel indice et ajoute que le DOM. Lors de la suppression d'un LineItem, je dois actuellement renuméroter tous les index et c'est la partie que j'aimerais éviter, est-ce possible?

+0

Ok Je déteste le dire, mais n'y a-t-il aucun moyen de faire accepter à Spring Controller ce que PHP accepte, je veux dire mettre [] dans le chemin? – yglodt

Répondre

3

Vous pouvez utiliser les

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

     }); 
    } 

} 

suivantes, dans la méthode onBind, vous supprimez des références null selon:

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

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

Cordialement,

+0

Ils marchent ensemble. Cette question n'était pas vraiment un problème, je me demande s'il y a une meilleure façon que la liste lazyList d'apache commons. –

1

J'ai trouvé que la décoration aussi avec un GrowthList est nécessaire pour éviter certaines erreurs lors de l'ajout/définition d'éléments dans JSP. (J'ai également créé un outil personnalisé SpringList qui fait essentiellement la double décoration.)

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

Je suis d'accord. Le problème est certainement de supprimer des éléments.

Ce que vous pouvez faire est d'utiliser la syntaxe spring marker dans le code HTML. Donc, si vous supprimez un élément (à l'index 2 par exemple) dans la liste en utilisant javascript, vous marquez cet index:

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

Puis, quand la forme est le printemps soumis verra le marqueur et mis dans un vide item (basé sur la factory lazylist) pour lineItems 2 au lieu de l'ignorer.

11

J'ai implémenté un tutoriel qui pourrait vous aider à résoudre ce problème en utilisant jQuery du côté client et Springs AutoPopulating list pour les objets de support de formulaire.

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

EDIT Lien de Webarchive https://web.archive.org/web/20160729163958/http://eggsylife.co.uk/2009/11/30/spring-forms-dynamic-lists-and-ajax/

+0

@ eggsy84 Qu'en est-il de la suppression dynamique d'objets? – Erlan

1

J'ai été aux prises avec ce problème aujourd'hui et pensé à une solution décrite here.

Questions connexes