Калитка - Как использовать ListView в пользовательском компоненте формы?

Я пытаюсь реализовать пользовательский компонент формы, который содержит ListView.

Мой пользовательский компонент формы:

public class NotificationDataListPanel extends FormComponentPanel {

    private ListView<NotificationDataBean> listView = null;

    public NotificationDataListPanel(String id) {
        this(id, null);
    }

    public NotificationDataListPanel(String id, List list) {
        super(id);

        listView = new ListView<NotificationDataBean>("listView") {
            @Override
            protected void populateItem(final ListItem<NotificationDataBean> item) {
                final NotificationDataPanel dataPanel = new NotificationDataPanel("dataPanel", new Model<NotificationDataBean>() {
                    @Override
                    public NotificationDataBean getObject() {
                        return item.getModel().getObject();
                    }

                    @Override
                    public void setObject(final NotificationDataBean value) {
                        item.setModelObject(value);
                    }
                });
                item.add(dataPanel);
            }
        };
        add(listView);

        add(new AjaxLink("addNewNDPanel") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                List<NotificationDataBean> modelObject = listView.getModelObject();
                if (modelObject == null) {
                    modelObject = new ArrayList<NotificationDataBean>();
                }
                modelObject.add(new NotificationDataBean());
                listView.setModelObject(modelObject);

                target.add(this);
            }
        });
    }

    @Override
    protected void onBeforeRender() {
        super.onBeforeRender();
        List<NotificationDataBean> modelObject = (List<NotificationDataBean>) getModelObject();
        if (modelObject != null && !modelObject.isEmpty()) {
            listView.setModelObject(modelObject);
        } else {
            listView.setModel(new Model());
        }
    }

    @Override
    protected void convertInput() {
        List<NotificationDataBean> modelObject = listView.getModelObject();

        setConvertedInput(modelObject);
        updateModel();
    }
}

NotificationDataPanel отлично работает в формах сам по себе, и с другой стороны, я мог бы использовать его в ListView в формах (не в отдельном компоненте формы).

Работает отлично:

    final Form form = new Form("form", new CompoundPropertyModel(testFormBean));

    final ListView<NotificationDataBean> strs = new ListView<NotificationDataBean>("notiL") {
        @Override
        protected void populateItem(final ListItem<NotificationDataBean> item) {
            final NotificationDataPanel quxField = new NotificationDataPanel("str", new Model<NotificationDataBean>() {
                @Override
                public NotificationDataBean getObject() {
                    return item.getModel().getObject();
                }

                @Override
                public void setObject(final NotificationDataBean value) {
                    item.setModelObject(value);
                }
            });
            item.add(quxField);
        }
    };
    form.add(strs);

Но когда я пытался использовать его в ListView в отдельном компоненте формы я получил это исключение.

Last cause: No get method defined for class: class TestFormBean expression: listView

НЕ ХОРОШО

    final Form form = new Form("form", new CompoundPropertyModel(testFormBean));
    form.add(new NotificationDataListPanel("notiL"));

А также TestFormBean учебный класс:

class TestFormBean implements Serializable {
    List<NotificationDataBean> notiL;
}

Слово listView в исключении относится к ListView идентификатор в NotificationDataListPanel,

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

1 ответ

Решение

Вы не предоставляете модель для своего ListView, поэтому он будет искать модель в иерархии компонентов. CompountPropertyModel передает модели дочерним компонентам и использует их идентификатор для поиска свойства в своей модели.

Вы, вероятно, просто хотите сделать:

new ListView<NotificationDataBean>("listView", list);
Другие вопросы по тегам