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有一个Delete按钮,单击此按钮时,我需要从列表中删除相关项.
>我可以使PersonListEditor监听项目小部件的通知(例如“我的删除按钮被点击”),但在这种情况下,我只会引用小部件,而不是我需要的真正的Person对象.我还可以添加一些逻辑来从面板项列表中获取相关的小部件索引,然后通过该索引获取Person对象,但这看起来很糟糕.
>我可以让我的PersonListItemWidget成为ValueAwareEditor,因此每个小部件都会知道它的Person,但是对于我来说,ValueAwareEditor的整个想法看起来像MVP违规,因为Google认为View层不应该知道模型,它应该只是“按钮“和”标签“.
这里有什么正确的方法?
最佳答案 两种方法都没问题.
MVP并非一成不变(它甚至没有定义;它是由Martin Fowler创造的,但是他支持两种更具体的模式),所以你只是违反了你给自己的规则.换句话说,编辑器框架作为一个整体可以被视为违反MVP:每个编辑器都知道模型,不一定是它正在编辑的确切实例(与ValueAwareEditor或LeafValue一样),但至少是它编辑的对象类型.
仅供参考,我们使用索引来做.更重要的是,它保证工作比“看起来不错”(即使它看起来也很好看,它显然更好).