J'ai une page de recherche avec un panneau à onglets, avec un formulaire dans chaque onglet (voir le code ci-dessous), qui, une fois soumis, recherche des résultats dans la base de données. Cependant, le support du bouton arrière de ce formulaire ne fonctionne pas (le texte fourni par l'utilisateur dans textField est perdu). Comment puis-je implémenter le support du bouton arrière pour ce formulaire? J'ai joué avec l'émission de setVersioned (true) sur la page, panel, form et textField en combinaison avec modelChanging() et modelChanged() sur le textField et le formulaire, mais aucun d'entre eux n'a fonctionné. J'ai également essayé la méthode redéfinie newLink de TabbedPanel comme détaillé here, mais cela n'a pas fonctionné non plus. Je suis à perte ...Comment puis-je implémenter le support des boutons de retour sur un formulaire dans Wicket?
Toute aide serait grandement appréciée.
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);
}
}
page Classe:
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));
}
}
Merci Tnem! En effet, le problème était dans le IndatingAjaxButton. J'ai remplacé ceci avec un bouton de soumission régulier en html, et ajouté des méthodes de substitution onSubmit et onError au formulaire, pour réguler quand le panneau de résultats est visible. Cela fonctionne maintenant. – Simmer