Има ли нещо в Wicket, което да направи два падащи избора, така че първият избор на първия doprdownchoice да промени всички опции на втория?
Wicket, как изборът на DropDownChoice може да промени опциите на друг DropDownChoice?
Отговори (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
Този? 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
Е, току-що го написахте, въпреки че на езика на природата... в метод, който обработва промяната на стойността, трябва да проверите - текущата избрана стойност е 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