Валидатор на калитке повторного просмотра

Я вставляю входы на повторный просмотр (быстрый просмотр). Когда эти входы содержат ошибки (например, RequiredValidator), событие отправки останавливается, но ошибки не отображаются. Как проверить и отобразить ошибки при повторном просмотре?

AddBaseEstimatePanel.java

public class AddBaseEstimatePanel extends Panel {

private void initForm(final Form<Estimate> form, final FeedbackPanel feedbackPanel) {
...
                IDataProvider<EstimateDetailModel> data = new ListDataProvider<EstimateDetailModel>(
                        listEstimateDetailModel);
                final WebMarkupContainer mitsumoriDeitaShōsaiRowssTable = new WebMarkupContainer(
            "mitsumoriDeitaShōsaiRowssTable");
            final EstimateDetailListAddTable mitsumoriDeitaShōsaiRows = new EstimateDetailListAddTable(
            "mitsumoriDeitaShōsaiRows", data, listEstimateDetailModel,
            new ItemsNavigationStrategy(), 10, start, null) {
        private static final long serialVersionUID = 3950744346751551366L;

        @Override
        protected void initRow() {
            super.initRow();
            // addNewItems(initProductEmptyRows(5));
        }

        @Override
        protected void onCheckBoxChange(EstimateDetailModel model,
                AjaxRequestTarget target) {
            super.onCheckBoxChange(model, target);
            if (model.isChecked()) {
                deleteProductBtn.setEnabled(true);
            } else {
                deleteProductBtn.setEnabled(hasCheckBoxChecked());
            }
            checkAll = allCheckboxIsChecked();
            target.add(deleteProductBtn, checkAllCheckbox);
        }

        @Override
        protected void onKeyTeikyo(AjaxRequestTarget target) {
            super.onKeyTeikyo(target);
            addNewItems(initProductEmptyRows(1));
        }

        @Override
        protected void countTotal(EstimateDetailModel model,
                AjaxRequestTarget target, Component... components) {
            if (model.getUnitPrice() == null || model.getQuantity() == null) {
                return;
            }
            float _amount = model.getUnitPrice() * model.getQuantity();
            countTotal -= model.getAmount();
            model.setAmount(_amount);
            countTotal += model.getAmount();
            target.add(total);
            target.add(components);
        }
    };
    mitsumoriDeitaShōsaiRowssTable.add(mitsumoriDeitaShōsaiRows);
    ...

}

EstimateDetailListAddTable.java

public abstract class EstimateDetailListAddTable extends
    QuickView<EstimateDetailModel> {
    @Override
protected void populate(final Item<EstimateDetailModel> item) {
    CheckBoxAjaxChange checkbox = new CheckBoxAjaxChange("checkbox",
            new PropertyModel<Boolean>(item.getModel(), "checked")) {
        private static final long serialVersionUID = 3455428602642567322L;

        @Override
        protected void onCheckChange(final AjaxRequestTarget target) {
            if (item.getModelObject().isChecked()) {
                selectedItems.add(item);
            } else {
                selectedItems.remove(item);
            }
            onCheckBoxChange(item.getModelObject(), target);
        }
    };
    Label no = new Label("no", new PropertyModel<Integer>(item.getModel(),
            "no"));
    final Select2ChoiceBase<Product> codeSelect = new Select2ChoiceBase<Product>(
            "code", new PropertyModel<Product>(item.getModel(), "product"),
            new ProductIdProvider(products, estimateDetailModels)) {
        private static final long serialVersionUID = 737457596926341699L;

        @Override
        protected void config() {
            super.config();
            getSettings()
                    .setFormatSelection(
                            "function(obj){ if(obj.id==0)return '';return obj.id; }");
        }
    };
    final Select2ChoiceBase<Product> nameSelect = new Select2ChoiceBase<Product>(
            "name", new PropertyModel<Product>(item.getModel(), "product"),
            new ProductNameProvider(products, estimateDetailModels));
    final NumberTextField<Float> amount = new NumberTextField<Float>(
            "amount", new PropertyModel<Float>(item.getModel(), "amount")) {
        private static final long serialVersionUID = -2316554599671359643L;
    };
    final NumberTextField<Integer> quantity = new NumberTextField<Integer>(
            "quantity", new PropertyModel<Integer>(item.getModel(),
                    "quantity")) {
        private static final long serialVersionUID = -5753172372351592833L;

        @Override
        public void renderHead(IHeaderResponse response) {
            String script = "$('#" + getMarkupId()
                    + "').number( true, 0 );";
            response.render(OnDomReadyHeaderItem.forScript(script));
        }
    };
    quantity.setOutputMarkupId(true);
    final TextField<String> unit = new TextField<String>("unit",
            new PropertyModel<String>(item.getModel(), "product.unit")) {
        private static final long serialVersionUID = -2316554599671359643L;

        @SuppressWarnings("unchecked")
        @Override
        public <C> IConverter<C> getConverter(Class<C> type) {
            return (IConverter<C>) new UnitConverter();
        }
    };
    final NumberTextField<Integer> price = new NumberTextField<Integer>(
            "price", new PropertyModel<Integer>(item.getModel(),
                    "unitPrice")) {
        private static final long serialVersionUID = -8646496003644699535L;
    };
    unit.setOutputMarkupId(true);
    price.setOutputMarkupId(true);
    amount.setOutputMarkupId(true);
    quantity.add(new OnChangeAjaxBehavior() {
        private static final long serialVersionUID = 1563937210317123609L;

        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            onQuantityChange(item.getModelObject(), target, amount);
        }
    });
    price.add(new OnChangeAjaxBehavior() {
        private static final long serialVersionUID = -8638379626220896934L;

        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            onPriceChange(item.getModelObject(), target, amount);
        }
    });
    codeSelect.add(new OnChangeAjaxBehavior() {
        private static final long serialVersionUID = 7159818718453062684L;

        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            onCodeChange(item, target, nameSelect, quantity, unit, price,
                    amount);
        }
    });
    nameSelect.add(new OnChangeAjaxBehavior() {
        private static final long serialVersionUID = -7575744336298650067L;

        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            onNameChange(item, target, codeSelect, quantity, unit, price,
                    amount);
        }
    });
    final TextArea<String> apply = new TextArea<String>("apply",
            new PropertyModel<String>(item.getModel(), "tekiyo"));
    apply.add(new AbstractDefaultAjaxBehavior() {
        private static final long serialVersionUID = 3598447798201761103L;

        @Override
        protected void respond(AjaxRequestTarget target) {
            onKeyTeikyo(target);
        }

        @Override
        public void renderHead(Component component, IHeaderResponse response) {
            super.renderHead(component, response);
            // response.render();
        }
    });
    apply.add(StringValidator.maximumLength(40));
    apply.add(new OnChangeAjaxBehavior() {
        private static final long serialVersionUID = 1L;

        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            // target.add(apply);
        }
    });
    item.add(checkbox);
    item.add(no);
    item.add(codeSelect);
    item.add(nameSelect);
    item.add(quantity);
    item.add(price);
    item.add(unit);
    item.add(amount);
    item.add(apply);
    // item.add(new EstimateDetailValidator(item.getModelObject()));
}
}

О QuicketView: https://github.com/vineetsemwal/quickview


person luanvu    schedule 23.04.2015    source источник
comment
Я предполагаю, что это как-то связано со стратегией повторного использования, но я не знаю, что такое стратегия повторного использования по умолчанию для Quckview и можно ли ее изменить.   -  person thg    schedule 23.04.2015
comment
Он использует класс IQuickReuseStrategy, подкласс класса IItemReuseStrategy. детали IQuickReuseStrategy Я не так много знаю о стратегии повторного использования. Что я могу с этим сделать?   -  person luanvu    schedule 23.04.2015


Ответы (2)


Вы должны использовать https: //github.com/vineetsemwal/quickview/blob/b52cc594b1118e741f38625574a38208d096419a/wicket-quickview/src/main/java/com/aplombee/ReuseAllStrategy.java.

Кроме того, вы должны назначить IValidator для FormComponent и/или IFormValidator для компонентов формы. Добавление валидатора к элементу ничего не даст.

person martin-g    schedule 23.04.2015
comment
Это сработало. Большое тебе спасибо. Я хочу проголосовать за вас, но у меня недостаточно репутации. - person luanvu; 23.04.2015
comment
У меня новая ошибка. Когда форма обновляется, старые строки в быстром просмотре имеют проблемы с ajax. Он не обновляется, когда происходит событие ajax. - person luanvu; 24.04.2015

только что отправил изменение в master на git, ReuseAllStrategy теперь не должен показывать устаревшие данные при повторном рендеринге, если проблема не устранена или новое изменение нарушает некоторые другие вещи;) создайте проблему в github. намеревался написать комментарий к вашему вопросу о предыдущем ответе, но понял, что у вас должны быть баллы, чтобы прокомментировать или проголосовать :)

(Извините за поздний ответ)

person bindas    schedule 15.05.2015