лучший способ для динамических форм с помощью Spring? - PullRequest
17 голосов
/ 21 мая 2009

Что мне интересно, если есть более простой / лучший способ обработки динамических форм (добавление элементов формы в dom с помощью js) при использовании форм SpringMVC и Spring?

Отображение объекта Invoice с несколькими LineItems.

public class Invocie {
    private List LineItems;

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

Чтобы показать элементы, принадлежащие счету, который я сейчас использую

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

Чтобы добавить LineItems, у меня есть несколько js, которые вычисляют новый индекс и добавляют его в DOM. При удалении LineItem мне нужно изменить нумерацию всех индексов, и это та часть, которую я хотел бы избежать, возможно ли это?

Ответы [ 4 ]

11 голосов
/ 01 декабря 2009

Я реализовал учебное пособие, которое может помочь вам решить эту проблему с помощью jQuery на стороне клиента и списка автозаполнения Springs для создания вспомогательных объектов.

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

EDIT Ссылка из вебархива https://web.archive.org/web/20160729163958/http://eggsylife.co.uk/2009/11/30/spring-forms-dynamic-lists-and-ajax/

3 голосов
/ 23 июня 2009

Вы можете использовать следующее

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

        });
    }

}

Затем в методе onBind вы удаляете пустые ссылки в соответствии с:

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

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

С уважением,

1 голос
/ 29 декабря 2010

Я боролся с этой проблемой сегодня и нашел какое-то решение, описанное здесь .

1 голос
/ 14 июля 2009

Я обнаружил, что декорирование с помощью GrowthList необходимо, чтобы избежать некоторых ошибок при добавлении / настройке элементов в JSP. (Также создан специальный SpringList, который в основном выполняет двойное оформление.)

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

Я согласен. Проблема, безусловно, в удалении предметов.

Что вы можете сделать, это использовать синтаксис spring marker в html. Поэтому, если вы удаляете элемент (например, с индексом 2) из ​​списка с помощью javascript, вы должны пометить этот индекс следующим образом:

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

Затем при отправке формы пружина увидит маркер и поместит пустой элемент (на основе фабрики lazylist) для lineItems 2 вместо его игнорирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...