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

4
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监听item widget的通知(比如“我的删除按钮被点击了”),但是在这种情况下,我只有对widget的引用,而不是实际需要的Person对象。我还可以添加一些逻辑来从面板项列表中获取相关widget的索引,然后通过该索引获取Person对象,但这看起来很糟糕。

  2. 我可以让我的PersonListItemWidget成为ValueAwareEditor,这样每个小部件都会知道它的Person,但整个ValueAwareEditor的想法对我来说似乎违反了MVP原则,因为Google表示View层不应该知道模型,它应该只是“按钮”和“标签”。

这里应该采取什么正确的方法呢?

1个回答

2

无论哪种方法都可以。

MVP并没有固定的定义(甚至都没有被明确定义;它是由Martin Fowler创造的,但他已经 放弃了这个术语 转而支持两种更具体的模式),所以你只是违反了自己设定的规则。换句话说,整个Editor框架可以被视为违反MVP:每个编辑器都知道模型,但不一定知道它正在编辑的确切实例(如ValueAwareEditorLeafValue),但至少知道它所编辑的对象类型

顺便提一下,我们是使用索引来做到的。重要的是它保证能够工作,而不是它“看起来很好”(尽管显然如果它同时也看起来不错会更好)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接