Как связать события выпадающего списка Wicket? - PullRequest
1 голос
/ 21 ноября 2010

Я пытаюсь связать события выпадающего списка.

У меня есть эти данные:

Имя auidi (a4 {2006,2007,2008}, a6 {2006,2007,2009}, тт {2005,2008,2010})ford (crown {2009,2010}, escape {2008,2009}) *

Когда я выбираю название автомобиля, я хочу показать модели.Позже я выбираю модель и хочу показать годы.

Я нашел этот пример: http://wicketstuff.org/wicket14/nested/?wicket:bookmarkablePage=:org.apache.wicket.examples.ajax.builtin.ChoicePage

Но там есть два выпадающих списка.Также есть карта.Должен ли я использовать карту на карте?Если да, то как я могу установить модель?

Когда карта имеет тип Map<String ,List<String >>, модель выглядит следующим образом:

IModel<List<? extends String>> makeChoices = 
    new AbstractReadOnlyModel<List<? extends String>>() 
    { 
        @Override 
        public List<String> getObject() 
        { 
            Set<String> keys = modelsMap.keySet(); 
            List<String> list = new ArrayList<String>(keys); 
            return list; 
        } 
    }; 

Что если карта Map<String,Map<String ,List<String >>>?

Если я кодирую

IModel<Map? extends String>> makeChoices = new AbstractReadOnlyModel<Map<? extends String>>() 

Моя среда IDE предупреждает меня, что ожидает два аргумента, и я не знаю, как назначить значения для карты в модели.

1 Ответ

2 голосов
/ 21 ноября 2010

В вашем случае для 3 DropDownChoices вам понадобятся 3 модели, и все они должны представлять списки, которые предоставляют варианты выбора. Вам нужны вложенные карты для имитации их отношений, а затем для поиска, например:

Map<String, Map<String, List<String>>> cars; //fill data
IModel<List<? extends String>> makeChoices = new AbstractReadOnlyModel<List<? extends String>>() {
        @Override
        public List<String> getObject() {
            Set<String> keys = cars.keySet();
            List<String> list = new ArrayList<String>(keys);
            return list;
        }
    };

IModel<List<? extends String>> modelChoices = new AbstractReadOnlyModel<List<? extends String>>() {
        @Override
        public List<String> getObject() {
            Map<String, List<String>> models = cars.get(selectedMake);
            if (models == null) {
                return Collections.emptyList();
            } else {
                List<String> list = new ArrayList<String>(models.keySet());
                return list;
            }
        }
    };

 IModel<List<? extends String>> yearChoices = new AbstractReadOnlyModel<List<? extends String>>() {
        @Override
        public List<String> getObject() {
            Map<String, List<String>> models = cars.get(selectedMake);
            if (models == null) {
                return Collections.emptyList();
            } else {
                return models.get(selectedModel);
            }
        }
    };
...