【问题标题】:AbstractReadonlyModel in wicket Frameworkwicket 框架中的 AbstractReadonlyModel
【发布时间】:2011-08-23 00:11:21
【问题描述】:
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 有什么用?我无法理解这个程序的逻辑。任何人都可以帮助理解这个

【问题讨论】:

    标签: java frameworks wicket


    【解决方案1】:

    使用这些AbstractReadOnlyModels,因为它们的内容不得更改。

    第一个模型提供汽车品牌列表,可以通过下拉列表进行选择。第二个模型根据所选品牌返回汽车类型列表,可通过另一个下拉列表进行选择。

    在这里更改品牌或车型列表是没有意义的。

    【讨论】:

      【解决方案2】:

      你指的是this wicket example

      每个DropDownChoice 都需要自己的模型和数据来显示其选择。

      第一个 AbstractReadOnlyModel 只是将 Map modelsMap 的键作为其数据。 第二个使用基于第一个下拉选择的选择的 Array-List。

      【讨论】:

        猜你喜欢
        • 2011-09-17
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 2011-09-04
        • 1970-01-01
        • 1970-01-01
        • 2010-12-23
        相关资源
        最近更新 更多