Я хотел протестировать AJAX DropDown в калитки 6.5 (пробовал калитки 6.6 и имел те же проблемы).Ajax не работает в калитке для меня
Я создал тестовый проект калитки с помощью быстрого старта калитки страницы - http://wicket.apache.org/start/quickstart.html
МВНА архетип: генерировать -DarchetypeGroupId = org.apache.wicket -DarchetypeArtifactId = калитка-архетипа-быстрый старт -DarchetypeVersion = 6.6.0 -DgroupId = net.betlista -DartifactId = tests.wicket-6,6 -DarchetypeRepository = https://repository.apache.org/ -DinteractiveMode = ложная
Я изменил HomaPage
к моему LoadableDropDownTestPage
в getHomePage()
генерируемого WicketApplication
с деваха.
код Java для LoadableDropDownTestPage является:
package net.betlista;
import java.io.Serializable;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.IAjaxIndicatorAware;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
public class LoadableDropDownTestPage extends WebPage implements IAjaxIndicatorAware {
public LoadableDropDownTestPage() {
addComponents();
}
private void addComponents() {
add(new FeedbackPanel("feedback"));
FormObject formObject = new FormObject();
Form<FormObject> form = new Form<FormObject>("loadableDropDownTestForm", Model.of(formObject));
form.setOutputMarkupId(true);
form.setOutputMarkupPlaceholderTag(true);
final DropDownChoice<String> countryDD = new LoadableDropDown("countryDD", new PropertyModel<String>(formObject, "country"));
countryDD.setChoices(new CountryLoadableModel());
countryDD.setOutputMarkupId(true);
countryDD.setRequired(true);
countryDD.setOutputMarkupPlaceholderTag(true);
final DropDownChoice<String> cityDD = new LoadableDropDown("cityDD", new PropertyModel<String>(formObject, "city"));
cityDD.setChoices(new CityLoadableModel());
cityDD.setOutputMarkupId(true);
cityDD.setRequired(true);
cityDD.setOutputMarkupPlaceholderTag(true);
countryDD.add(new OnChangeAjaxBehavior() {
@Override
protected void onUpdate(AjaxRequestTarget target) {
System.out.println("country DD changed");
target.add(cityDD);
}
});
form.add(countryDD);
form.add(cityDD);
form.add(new AjaxButton("ab") {});
add(form);
}
static class LoadableDropDown extends DropDownChoice<String> {
public LoadableDropDown(String id, IModel<String> model) {
super(id);
setModel(model);
}
}
static class FormObject implements Serializable {
String country;
String city;
}
class CountryLoadableModel extends LoadableDetachableModel<List<String>> {
@Override
protected List<String> load() {
System.out.println("loading CountryLoadableModel");
List<String> result = Arrays.asList(new String[] { "CR", "SR" });
return result;
}
}
class CityLoadableModel extends LoadableDetachableModel<List<String>> {
List<String> choices = new LinkedList<String>();
@Override
protected List<String> load() {
System.out.println("loading CityLoadableModel");
if (choices.isEmpty()) {
choices.add("1");
} else {
int size = choices.size();
choices.add(Integer.toString(size+1));
}
return choices;
}
}
@Override
public String getAjaxIndicatorMarkupId() {
return "ajaxIndicator";
}
}
и HTML для страницы:
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<div wicket:id="feedback"></div>
<form wicket:id="loadableDropDownTestForm">
Countries: <select wicket:id="countryDD"></select><br>
Cities: <select wicket:id="cityDD"></select><br>
<!-- input type="submit"-->
<button wicket:id="ab"></button>
</form>
</html>
Моя самая первая проблема в том, что я не мог видеть AJAX отладки ссылку на моей странице. Но я думаю, что пока есть OnChangeAjaxBehavior
, я должен это увидеть.
Следующая проблема заключается в том, что когда я изменяю значение в стране DropDown, ничего не происходит, и я понятия не имею, что я делаю неправильно.
В моем коде вы можете видеть, что я также пытался использовать AjaxButton, но это тоже не сработало.
редактировать:
часть журнала (он работает в режиме DEV)
********************************************************************
*** WARNING: Wicket is running in DEVELOPMENT mode. ***
*** ^^^^^^^^^^^ ***
*** Do NOT deploy to your live server(s) without changing this. ***
*** See Application#getConfigurationType() for more information. ***
********************************************************************
Аякса Debug Окно появляется только в режиме DEV. Проверьте наличие ошибок - как в консоли JS, так и в журналах сервера. Проверьте, выполняется ли вызов Ajax с помощью Firebug/Dev Tools. Ваш код не оптимален, но я не вижу ошибок. –
Спасибо за подсказку, но, согласно журналу, он работает в режиме DEV ... Я также попробую Firebug. – Betlista
Я не вижу никакого вызова AJAX в firebug: -/ – Betlista