Apache wicket: как обновить модель после ошибки проверки - PullRequest
2 голосов
/ 16 января 2012

У меня есть форма с dateTimeField и ListView. ListView выглядит так:

final ListView<String> countryView = new ListView<String>("country", model.<List<String>>bind("country")) {
            @Override
            protected void populateItem(final ListItem<String> item) {
                    final String country = item.getModelObject();
                    item.add(new ValidationDisplayableLabel("country", country, new String[] { modelPath }));
                    item.add(new AjaxLink("deleteLink") {
                        @Override
                        public void onClick(AjaxRequestTarget target) {
                            model.getObject().getCountry().remove(country);
                            if (issPeriod) {
                                addButton.setVisible(true);
                                countryTextField.setVisible(true);
                                findButton.setVisible(true);
                            }
                            if (target != null)
                                target.addComponent(rowPanel);
                        }
                    });
            }
        };
        countryTextField = new ValidationDisplayableTextField("countryCodeInput", model.bind("oneCountry"), "job.country.value");

        **countryView.setReuseItems(true);**
        rowPanel.add(countryView);
        rowPanel.add(countryTextField);
        addButton.setOutputMarkupPlaceholderTag(true);
        rowPanel.add(addButton);

И кнопка addButton выглядит так:

AjaxSubmitLink addButton = new AjaxSubmitLink(LinkNames.addCountry.toString()) {
        @Override
        public void onSubmit(AjaxRequestTarget target, Form form) {
            if (model.getObject().getOneCountry() != null)
                addCountry();
                if (target != null)
                    target.addComponent(rowPanel);
                target.addComponent(form.getPage().get("feedbackPanel"));
        }
        @Override
        protected void onError(AjaxRequestTarget target, Form<?> form)
        {
            onSubmit(target, form);
        }
    };

Дело в том, что когда мне не удается установить dateTimeField (например, установить часы на 100), ввести код страны в countryTextField и нажать на кнопку addButton, на панели обратной связи отобразится сообщение о проверке, этот часовой диапазон неверен, но не добавить страну. Это потому, что моя модель не обновлена. Может быть, есть способ обновить его вручную? Таким образом, сообщение проверки будет отображаться, но список стран по-прежнему может быть обновлен?

Отправка всей формы осуществляется с помощью другой кнопки, поэтому логично добавить страну, даже если в dateTimeField есть ошибка проверки.

Спасибо!

P.S. Я прочитал много постов о подобной проблеме, но большинство из них были решены с помощью .setReuseItems (true), но в моем случае это не работает.

P.P.S Apache калитка 1.4.17

Ответы [ 3 ]

5 голосов
/ 04 апреля 2013

В качестве обновления к этому ответу в Wicket 6 вы можете сделать это, переопределив onError () в форме:

@Override
    protected void onError() {
    super.onError();
    this.updateFormComponentModels();
}
5 голосов
/ 16 января 2012

Я столкнулся с подобной проблемой в своем проекте, я нашел обходной путь - использовать специального посетителя. Он обновит модель, даже если введенные данные неверны.

public class VisitorUpdateModelWithoutValidation implements FormComponent.IVisitor {

public Object formComponent(IFormVisitorParticipant formComponent) {
        if (formComponent instanceof FormComponent) {
            final FormComponent<?> formComponent1 = (FormComponent<?>) formComponent;
            boolean required = formComponent1.isRequired();
            if (required) {
                formComponent1.setRequired(false);
            }
            formComponent1.modelChanging();
            formComponent1.validate();
            formComponent1.updateModel();
            formComponent1.modelChanged();
            if (required) {
                formComponent1.setRequired(true);
            }
        }

        return Component.IVisitor.CONTINUE_TRAVERSAL;
    }
}

Просто используйте его в onSubmit методе вашего поведения: getForm().visitFormComponents(new VisitorUpdateModelWithoutValidation());

2 голосов
/ 05 января 2015

Вы можете выдать field.clearInput() в полях, которые вы обновляете, прежде чем нацеливать обновление (я).

...