GWT编辑器框架 - ListEditor,删除项目,MVP违规

时间:2011-10-27 09:40:58

标签: java gwt mvp gwt-editors

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监听项目窗口小部件的通知(例如“点击我的删除按钮”),但在这种情况下,我只会引用窗口小部件而不是真实的{{事实上我需要的对象。我也可以添加一些逻辑来从面板项列表中获取相关的widget索引,然后通过该索引获取Person对象,但这看起来很糟糕。

  2. 我可以将Person设为PersonListItemWidget,因此每个小部件都会知道其ValueAwareEditor,但Person的整个想法看起来像MVP违规对我来说,因为谷歌说View层不应该知道模型,它应该只是“按钮”和“标签”。

  3. 这里有什么正确的方法?

1 个答案:

答案 0 :(得分:2)

两种方法都没问题。

MVP并非一成不变(它甚至没有定义;它是由Martin Fowler创造的,但他retired the term支持两种更具体的模式),所以你只是违反了你给自己的规则。换句话说,编辑框架作为一个整体可以被视为违反MVP:每个编辑都知道模型,不一定是它正在编辑的确切实例(与ValueAwareEditorLeafValue一样),但至少< em> kind 的对象是它的编辑。

仅供参考,我们使用索引来做。更重要的是,保证工作比“看起来不错”更重要(尽管如果看起来很好,它显然会更好)。