GWT Editors framework - ListEditor, удаление элементов, нарушение MVP

public class PersonListEditor extends Composite implements IsEditor<ListEditor<Person, PersonListItemWidget>> {
    private static PersonListEditorUiBinder uiBinder = GWT.create(PersonListEditorUiBinder.class);
    interface PersonListEditorUiBinder extends UiBinder<Widget, PersonListEditor> {}

    private class Source extends EditorSource<PersonListItemWidget> {
        @Override
        public PersonListItemWidget create(int index) {
            PersonListItemWidget widget = new PersonListItemWidget();
            panel.insert(widget, index);
            return widget;
        }                   
    }   

    @UiField VerticalPanel panel;
    private ListEditor<Person, PersonListItemWidget> editor = ListEditor.of(new Source());

    public PersonListEditor() {
        initWidget(uiBinder.createAndBindUi(this));
    }

    @Override
    public ListEditor<Person, PersonListItemWidget> asEditor() {
        return editor;
    }
}

PersonListItemWidget имеет кнопку Удалить, и когда эта кнопка нажата, мне нужно удалить связанный элемент из списка.

  1. я могу сделать PersonListEditor прослушивать уведомления виджета элемента (например, "нажата моя кнопка удаления"), но в этом случае у меня будет только ссылка на виджет, а не реальная Person объект, который мне нужен на самом деле. Я также могу добавить некоторую логику, чтобы получить индекс соответствующего виджета из списка элементов панели, а затем получить Person объект по этому индексу, но это выглядит ужасно.

  2. Я могу сделать мой PersonListItemWidget быть ValueAwareEditorпоэтому каждый виджет будет знать свой Person, но вся идея ValueAwareEditor Похоже, нарушение MVP для меня, так как Google говорит, что слой View не должен знать о модели, и это должны быть только "кнопки" и "метки".

Какой правильный подход здесь?

1 ответ

Решение

Любой подход в порядке.

MVP не установлен в камне (он даже не определен; он был придуман Мартином Фаулером, но он отказался от термина в пользу двух более конкретных моделей), так что вы нарушаете только те правила, которые вы дали себе. Иными словами, каркас редактора в целом можно рассматривать как нарушающий MVP: каждый редактор знает модель, а не точный экземпляр, который она редактирует (как в случае с ValueAwareEditor или же LeafValue), но, по крайней мере, это те объекты, которые он редактировал.

К вашему сведению, мы делаем это с помощью индексов. Более важно то, что он гарантированно работает, чем то, что он "хорошо выглядит" (хотя, очевидно, лучше, если он тоже хорошо выглядит).

Другие вопросы по тегам