Wicket: getModelObject возвращает ноль - PullRequest
2 голосов
/ 18 февраля 2011

У меня проблемы с getModelObject.Возвращается ноль.На самом деле концепция модели мне не понятна.Код:

public class SpaceCheckListWindow extends WebPage {
private SpaceCheckListForm spaceCheckListForm;
private Page parentPage;
private ModalWindow modalWindow;

public SpaceCheckListWindow(Page parentPage, final ModalWindow modalWindow) {
    this.parentPage = parentPage;
    this.modalWindow = modalWindow;

    String[] labels = new String[] {
            "a", 
            "b",
            "c",
            "d",
            "e",
            "f"
    };

    List<ListMemeber> list = new ArrayList<ListMemeber>();

    for(String label : labels) {
        list.add(new ListMemeber(label));
    }

    addComponent(list);
}   

private void addComponent(List<ListMemeber> list) {
    spaceCheckListForm = new SpaceCheckListForm("form", list);
    add(spaceCheckListForm);
}

private class SpaceCheckListForm extends Form {

    private static final long serialVersionUID = 1L;

    public SpaceCheckListForm(String id, final List<ListMemeber> list) {
        super(id);

        ListView listView = new ListView("listView", list) {

            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(ListItem listItem) {
                ListMemeber member = (ListMemeber) listItem.getModelObject();
                listItem.add(new Label("label", member.getLabel()));
                listItem.add(new CheckBox("checkbox", new PropertyModel(member, "selected")));
            }
        };

        listView.setReuseItems(true);
        add(listView);

        AjaxButton submitBtn = new AjaxButton("submitBtn", this) {

            private static final long serialVersionUID = 1L;

            @Override
            protected void onSubmit(AjaxRequestTarget target, Form form) {
                System.out.println(spaceCheckListForm.getModelObject());
                modalWindow.close(target);
            }
        };

        add(submitBtn);
    }

}

private class ListMemeber implements Serializable {
    private String label;
    private Boolean selected = Boolean.FALSE;

    public ListMemeber(String label) {
        this.label = label;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public Boolean getSelected() {
        return selected;
    }

    public void setSelected(Boolean selected) {
        this.selected = selected;
    }

    @Override
    public String toString() {
        return label + Boolean.toString(selected);
    }
}

}

Теперь нажмите кнопку AjaxButton, которая возвращает ноль.Я хочу получить метки и соответствующие значения флажков.Что я должен сделать, чтобы получить это?Любая информация будет очень полезна для меня.Спасибо.

1 Ответ

3 голосов
/ 18 февраля 2011

Иерархия компонентов выглядит следующим образом:

SpaceCheckListWindow  
 SpaceCheckListForm (id: form)
  ListView (id: listView)
   ListItem (id: <generated by wicket>)
    Label (id: label)
    CheckBox (id: checkbox)
  AjaxButton (id: submitBtn)

В Wicket каждый компонент может иметь модель, в которой хранятся данные, которые он отображает / манипулирует. Эта модель обычно передается компоненту в конструкторе. Если этого не происходит, компонент инициализируется с пустой моделью (что само по себе не является ошибкой). Но в вашем коде ваша форма создается с пустой моделью, и обновлять модель тоже нечего, поэтому getModelObject() всегда будет возвращать ноль. Это снова не ошибка, ваша форма не обязательно должна иметь сам объект модели.

Единственный компонент, имеющий здесь нетривиальную модель - это CheckBox, который читает / обновляет поле selected в ListMemeber, как и должно быть. (Обновление: конечно, у вашего Label есть непустая модель, но метки только читают свою модель, но никогда не обновляют ее.)

Итак, подведем итог: в этом коде нет ничего принципиально неправильного, вы просто ищете результат в неправильном месте: вместо выхода из объекта модели в форме перечислите поля selected всех список участников, чтобы увидеть, что меняется, когда вы отправляете свою форму.

Некоторые дополнительные сведения о моделях Wicket: Работа с моделями Wicket

...