AbstractReadonlyModel в платформе калитки - PullRequest
1 голос
/ 11 мая 2011
package org.apache.wicket.examples.ajax.builtin;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;

/**
 * Linked select boxes example
 * 
 * @author Igor Vaynberg (ivaynberg)
 */
public class ChoicePage extends BasePage
{
private String selectedMake;

private final Map<String, List<String>> modelsMap = new HashMap<String, List<String>>(); // map:company->model

/**
 * @return Currently selected make
 */
public String getSelectedMake()
{
    return selectedMake;
}

/**
 * @param selectedMake
 *            The make that is currently selected
 */
public void setSelectedMake(String selectedMake)
{
    this.selectedMake = selectedMake;
}

/**
 * Constructor.
 */
public ChoicePage()
{
    modelsMap.put("AUDI", Arrays.asList(new String[] { "A4", "A6", "TT" }));
    modelsMap.put("CADILLAC", Arrays.asList(new String[] { "CTS", "DTS", "ESCALADE", "SRX",
            "DEVILLE" }));
    modelsMap.put("FORD", Arrays.asList(new String[] { "CROWN", "ESCAPE", "EXPEDITION",
            "EXPLORER", "F-150" }));

    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;
        }

    };

    IModel<List<? extends String>> modelChoices = new AbstractReadOnlyModel<List<? extends String>>()
    {
        @Override
        public List<String> getObject()
        {
            List<String> models = modelsMap.get(selectedMake);
            if (models == null)
            {
                models = Collections.emptyList();
            }
            return models;
        }

    };

    Form<?> form = new Form("form");
    add(form);

    final DropDownChoice<String> makes = new DropDownChoice<String>("makes",
        new PropertyModel<String>(this, "selectedMake"), makeChoices);

    final DropDownChoice<String> models = new DropDownChoice<String>("models",
        new Model<String>(), modelChoices);
    models.setOutputMarkupId(true);

    form.add(makes);
    form.add(models);

    makes.add(new AjaxFormComponentUpdatingBehavior("onchange")
    {
        @Override
        protected void onUpdate(AjaxRequestTarget target)
        {
            target.addComponent(models);
        }
    });
}

}

Для чего здесь используются два AbstractReadonlyModel? Я не мог понять логику этой программы. Может кто-нибудь, пожалуйста, помогите понять это

Ответы [ 2 ]

4 голосов
/ 11 мая 2011

Эти AbstractReadOnlyModels используются, потому что их содержание не должно изменяться.

Первая модель содержит список марок автомобилей, который можно выбрать с помощью раскрывающегося списка.Вторая модель возвращает в зависимости от выбранной марки список типов автомобилей, который можно выбрать с помощью другого раскрывающегося списка.

Здесь не имеет смысла изменять список марок или типов автомобилей.

2 голосов
/ 11 мая 2011

Вы ссылаетесь на этот пример калитки .

Каждый DropDownChoice нуждается в собственной модели с данными, чтобы показать свой выбор.

Первый AbstractReadOnlyModel просто берет ключи Карты modelsMap в качестве своих данных. Второй использует Array-List, основанный на выборе первого выпадающего списка.

...