Wicket, как выбор DropDownChoice может изменить параметры другого DropDownChoice?

Есть ли что-то в Wicket, чтобы сделать два раскрывающихся списка, чтобы первый выбор первого выбора doprdownchoice изменил все параметры второго?


person evilkorona    schedule 29.04.2014    source источник


Ответы (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
comment
Этот? DropDownChoice (идентификатор строки, IModel‹? расширяет список‹? расширяет выбор T››) Я не понимаю, как это будет работать, потому что, например, у первого ddc есть 1, 2 и 3 подобных параметра. Когда я выбираю 1, во втором ddc я хочу видеть (например) 4, 5, 6 вариантов. Когда я выбираю 2, я хочу видеть 7, 8, 9. Где эти параметры будут инициализированы? Спасибо :) - person evilkorona; 29.04.2014
comment
Ну, это ты только что написал, хотя и на натуральном языке... в методе, который обрабатывает изменение значения, ты должен проверить - его текущее выбранное значение равно 1, установить модель другого DDC, чтобы она содержала 4 5 6, если 2 - содержала 7 8 9. - person Alexey Malev; 29.04.2014
comment
@evilkorona Пожалуйста. Не забывайте голосовать за полезные сообщения и выбирать предпочтительные, если ваша проблема решена. - person Alexey Malev; 29.04.2014
comment
Я мог, т. Второй DDC не перерисовывается :( - person evilkorona; 29.04.2014
comment
Я не знаю, как это сделать ›‹ - person evilkorona; 29.04.2014
comment
Я думаю, что нашел ответ, но я действительно устал читать его сейчас topriddy.wordpress.com/2012/01/29/ - person evilkorona; 29.04.2014