Форма калитки: отключить кнопку отправки

В Wicket, когда я отключаю экземпляр Form, он полностью отключает мои поля ввода, но также не может отключить кнопку отправки.

Как отключить кнопку отправки, тоже желательно без необходимости добавлять wicket:id для кнопки отправки?


person Thomas S.    schedule 27.05.2014    source источник
comment
Почему вы не хотите использовать wicket:id?   -  person idontevenseethecode    schedule 27.05.2014
comment
Потому что я должен использовать его для каждой формы. Я бы предпочел, чтобы он работал автоматически - я скорее считаю это ошибкой в ​​Wicket, что он не отключает его автоматически.   -  person Thomas S.    schedule 28.05.2014
comment
Отключение формы также отключает все дочерние компоненты. Но без wicket:id калитка Component никогда не может быть создана для кнопки отправки, она остается простым HTML.   -  person idontevenseethecode    schedule 28.05.2014


Ответы (2)


Используйте AjaxSubmitLink и добавьте его в форму. Он будет включен/выключен вместе с формой:

HTML:

<button wicket:id="submit">Submit</button>

Джава:

form.add(new AjaxSubmitLink("submit"));
person idontevenseethecode    schedule 27.05.2014

Я решил эту проблему, автоматически создав Buttons. В моем WebApplication методе init() я устанавливаю AbstractMarkupFilter, который делает <input type="submit"/> автоматических ссылок:

markupSettings.setMarkupParserFactory(new IMarkupParserFactory() {
    public MarkupParser newMarkupParser(MarkupResourceStream resource) {
        final MarkupParser parser = new MarkupParser(new XmlPullParser(), resource);
        parser.appendMarkupFilter(new AbstractMarkupFilter() {
            public MarkupElement nextTag() throws ParseException {
                final ComponentTag tag = (ComponentTag)getParent().nextTag();
                if (tag == null) {
                    return null;
                }

                if (tag.getId() != null) {
                    return tag;
                }

                if (!tag.isOpen() && !tag.isOpenClose()) {
                    return tag;
                }

                if (tag.getName().equals("input") && !(tag instanceof WicketTag)) {
                    final String type = tag.getAttributes().getString("type");
                    if ("submit".equals(type)) {
                        tag.enableAutolink(true);
                        tag.setId(WicketLinkTagHandler.AUTOLINK_ID);
                        tag.setAutoComponentTag(true);
                        tag.setModified(true);
                    }
                }
                return tag;
            }
        };
        return parser;
    }
});

Затем я устанавливаю IComponentResolver перед существующим AutoLinkResolver:

final List<IComponentResolver> componentResolvers = getPageSettings().getComponentResolvers();
for (int i ; i < componentResolvers.size(); i++) {
    final IComponentResolver resolver = componentResolvers.get(i);
    if (resolver instanceof AutoLinkResolver) {
        componentResolvers.add(i, new IComponentResolver() {
            @Override
            public boolean resolve(MarkupContainer container, MarkupStream markupStream, ComponentTag tag) {
                if (tag.isAutolinkEnabled()) {
                    if (tag.getName().equals("input")) {
                        final String type = tag.getAttribute("type");
                        if ("submit".equals(type)) {
                            final Page page = container.getPage();
                            final String autoId = WicketLinkTagHandler.AUTOLINK_ID + Integer.toString(page.getAutoIndex());
                            if (tag.getId() == null) {
                                tag.setId(autoId);
                                tag.setAutoComponentTag(true);
                            }
                            container.autoAdd(new Button(autoId));
                            return true;
                        }
                    }
                }

                return false;
            }
        });
        break;
    }
}
person Thomas S.    schedule 05.06.2014