Как реализовать поддержку кнопки «Назад» в форме в Wicket?

У меня есть страница поиска с панелью с вкладками, с формой на каждой вкладке (см. код ниже), которая при отправке ищет в базе данных совпадения. Однако поддержка кнопки «Назад» в этой форме не работает (вводимый пользователем текст в текстовом поле теряется). Как реализовать поддержку кнопки «Назад» для этой формы? Я играл с выдачей setVersioned(true) на странице, панели, форме и текстовом поле в сочетании с modelChanging() и modelChanged() в текстовом поле и форме, но ни один из них не работал. Я также пытался переопределить метод newLink из TabbedPanel, как подробно описано здесь, но это тоже не сработало. Я в растерянности...

Любая помощь будет принята с благодарностью.

public class TextSearchPanel extends Panel {
    CompoundsDataTablePanel hitsPanel;

    @SpringBean
    ICompoundDAO            compoundDAO;

    public TextSearchPanel(final String id, final FeedbackPanelWrapper feedbackPanel) {
        super(id);
        setOutputMarkupId(true);

        // Text Search Form
        Form<TextSearchPanel> textform = new Form<TextSearchPanel>("textForm");

        // Add textField
        TextField<String> textField = new TextField<String>("query", new Model<String>());
        textField.setRequired(true);
        textField.add(new StringValidator() {
            @Override
            protected void onValidate(final IValidatable<String> validatable) {
                String query = Name.replaceApostropheVariantsWithApostrophe(validatable.getValue());
                try {
                    // Ascertain parsing query does not throw an exception
                    compoundDAO.parseQuery(query);
                }
                catch (ParseException e) {
                    // Otherwise: Display the error back to the user
                    validatable.error(new ValidationError().setMessage(e.getMessage()));
                }
            }
        });
        textform.add(textField);

        // Add submit button
        textform.add(new IndicatingAjaxButton("ajaxsubmit") {
            @Override
            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
                target.addComponent(feedbackPanel);
                // Show hits panel
                hitsPanel.setVisible(true);
                target.addComponent(TextSearchPanel.this);
            }

            @Override
            protected void onError(final AjaxRequestTarget target, final Form<?> form) {
                target.addComponent(feedbackPanel);
                // Hide hits panel
                hitsPanel.setVisible(false);
                target.addComponent(TextSearchPanel.this);
            }
        });
        add(textform);

        // Text Hits Panel
        hitsPanel = new CompoundsDataTablePanel("hits", new TextHitsProvider(textField.getModel()));
        hitsPanel.setVisible(false);
        add(hitsPanel);
    }
}

Класс страницы:

public class SearchPage extends BasePage {
public SearchPage() {
    super("Search");
    setOutputMarkupId(true);

    List<ITab> tabs = new ArrayList<ITab>();
    tabs.add(new AbstractTab(new Model<String>("Spectrum search")) {
        @Override
        public Panel getPanel(final String panelId) {
            return new SpectrumSearchPanel(panelId, getFeedbackPanelWrapper());
        }
    });
    tabs.add(new AbstractTab(new Model<String>("Mass search")) {
        @Override
        public Panel getPanel(final String panelId) {
            return new MassSearchPanel(panelId, getFeedbackPanelWrapper());
        }
    });
    tabs.add(new AbstractTab(new Model<String>("Formula search")) {
        @Override
        public Panel getPanel(final String panelId) {
            return new FormulaSearchPanel(panelId, getFeedbackPanelWrapper());
        }
    });
    tabs.add(new AbstractTab(new Model<String>("Text search")) {
        @Override
        public Panel getPanel(final String panelId) {
            return new TextSearchPanel(panelId, getFeedbackPanelWrapper());
        }
    });

    // Add tabs to page to switch between search modes
    add(new TabbedPanel("tabs", tabs));
}
 }

person Simmer    schedule 07.04.2011    source источник


Ответы (1)


У меня не было возможности попробовать ваш код, но может ли это быть проблемой с использованием ajax. Кнопка «Назад» еще не полностью поддерживается ajax в калитки: https://issues.apache.org/jira/browse/WICKET-271. Вы можете проверить версии просматриваемых страниц при нажатии кнопки «Назад» по сравнению с просмотром в первый раз.

person mark-cs    schedule 07.04.2011
comment
Спасибо Тнем! Действительно, проблема была в IndicatingAjaxButton. Я заменил это обычной кнопкой отправки в html и добавил методы переопределения onSubmit и onError в форму, чтобы регулировать, когда панель результатов видна. Теперь это работает. - person Simmer; 08.04.2011