Платформа редакторов GWT - 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 говорит, что слой просмотра не должен знать о модели, и это должны быть только «кнопки». " и "метки".

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


person Andrey Agibalov    schedule 27.10.2011    source источник


Ответы (1)


Любой подход хорош.

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

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

person Thomas Broyer    schedule 27.10.2011