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

Има ли нещо в Wicket, което да направи два падащи избора, така че първият избор на първия doprdownchoice да промени всички опции на втория?


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


Отговори (2)


Трябва да използвате стойността на първия избор, за да определите стойността на втория.

В този пример избрах да използвам AjaxFormComponentUpdatingBehavior, който задейства актуализацията на Ajax и извършва промяната на стойността. Предоставям простия пример за попълване на втория DropDownChoice с федералните щати на страната, която е избрана в първия.

Обърнете внимание, че използвам wicket 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(String id,IModel‹? extends List‹? extends T›› options) Не разбирам как ще работи, защото например първият 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