Есть ли что-то в Wicket, чтобы сделать два раскрывающихся списка, чтобы первый выбор первого выбора doprdownchoice изменил все параметры второго?
Wicket, как выбор DropDownChoice может изменить параметры другого DropDownChoice?
Ответы (2)
Вы должны использовать значение первого выбора, чтобы определить значение второго.
В этом примере я решил использовать AjaxFormComponentUpdatingBehavior
, который запускает обновление Ajax и выполняет изменение значения. Я привожу простой пример заполнения второго DropDownChoice
федеральными штатами страны, выбранной в первом.
Обратите внимание, что в этом примере я использую калитку 1.4, хотя в более новых версиях она не должна сильно отличаться.
// two countries
final String aut = "AUT";
final String ger = "GER";
// their states
final List<String> autStates = Arrays.asList(new String[] { "V", "T", "S", "W" });
final List<String> gerStates = Arrays.asList(new String[] { "NRW", "B", "BW" });
// mapping, you should really get this data from a service or have a constant
final Map<String, List<String>> countryToState = new HashMap<String, List<String>>(2);
countryToState.put(aut, autStates);
countryToState.put(ger, gerStates);
// the container to send back via ajax
final WebMarkupContainer cont = new WebMarkupContainer("cont");
cont.setOutputMarkupId(true);
add(cont);
final Model<String> stateModel = new Model<String>();
final DropDownChoice<String> countries = new DropDownChoice<String>("countries", new Model<String>(), new ArrayList<String>(countryToState.keySet()));
final DropDownChoice<String> states = new DropDownChoice<String>("states", stateModel, new LoadableDetachableModel<List<String>>() {
@Override
protected List<String> load() {
final String country = countries.getModelObject();
final List<String> list = countryToState.get(country);
return list != null ? list : new ArrayList<String>(0);
}
});
countries.add(new AjaxFormComponentUpdatingBehavior("onchange") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
// just add the container to see the results
target.addComponent(cont);
}
});
cont.add(countries);
cont.add(states);
person
msp
schedule
29.04.2014
Первый DropDownChoice
должен обновить Model
второй DropDownChoice
и добавить второй DDC к AjaxRequestTarget
.
Этот конструктор принимает модель, и вы можете сохранить ссылку на нее, чтобы иметь возможность изменить ее.
person
Alexey Malev
schedule
29.04.2014
Этот? DropDownChoice (идентификатор строки, IModel‹? расширяет список‹? расширяет выбор T››) Я не понимаю, как это будет работать, потому что, например, у первого ddc есть 1, 2 и 3 подобных параметра. Когда я выбираю 1, во втором ddc я хочу видеть (например) 4, 5, 6 вариантов. Когда я выбираю 2, я хочу видеть 7, 8, 9. Где эти параметры будут инициализированы? Спасибо :)
- person evilkorona; 29.04.2014
Ну, это ты только что написал, хотя и на натуральном языке... в методе, который обрабатывает изменение значения, ты должен проверить - его текущее выбранное значение равно 1, установить модель другого DDC, чтобы она содержала 4 5 6, если 2 - содержала 7 8 9.
- person Alexey Malev; 29.04.2014
@evilkorona Пожалуйста. Не забывайте голосовать за полезные сообщения и выбирать предпочтительные, если ваша проблема решена.
- person Alexey Malev; 29.04.2014
Я мог, т. Второй DDC не перерисовывается :(
- person evilkorona; 29.04.2014
Я не знаю, как это сделать ›‹
- person evilkorona; 29.04.2014
Я думаю, что нашел ответ, но я действительно устал читать его сейчас topriddy.wordpress.com/2012/01/29/
- person evilkorona; 29.04.2014