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
имеет кнопку Удалить, и когда эта кнопка нажата, мне нужно удалить связанный элемент из списка.
я могу сделать
PersonListEditor
прослушивать уведомления виджета элемента (например, "нажата моя кнопка удаления"), но в этом случае у меня будет только ссылка на виджет, а не реальнаяPerson
объект, который мне нужен на самом деле. Я также могу добавить некоторую логику, чтобы получить индекс соответствующего виджета из списка элементов панели, а затем получитьPerson
объект по этому индексу, но это выглядит ужасно.Я могу сделать мой
PersonListItemWidget
бытьValueAwareEditor
поэтому каждый виджет будет знать свойPerson
, но вся идеяValueAwareEditor
Похоже, нарушение MVP для меня, так как Google говорит, что слой View не должен знать о модели, и это должны быть только "кнопки" и "метки".
Какой правильный подход здесь?
1 ответ
Любой подход в порядке.
MVP не установлен в камне (он даже не определен; он был придуман Мартином Фаулером, но он отказался от термина в пользу двух более конкретных моделей), так что вы нарушаете только те правила, которые вы дали себе. Иными словами, каркас редактора в целом можно рассматривать как нарушающий MVP: каждый редактор знает модель, а не точный экземпляр, который она редактирует (как в случае с ValueAwareEditor
или же LeafValue
), но, по крайней мере, это те объекты, которые он редактировал.
К вашему сведению, мы делаем это с помощью индексов. Более важно то, что он гарантированно работает, чем то, что он "хорошо выглядит" (хотя, очевидно, лучше, если он тоже хорошо выглядит).