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

  2. 我可以让我PersonListItemWidget成为一个ValueAwareEditor,所以每个小部件都会知道它Person,但整个想法ValueAwareEditor对我来说看起来像是违反 MVP,因为谷歌说视图层不应该知道模型,它应该只是“按钮”和“标签” ”。

这里的正确方法是什么?

4

1 回答 1

2

任何一种方法都很好。

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

仅供参考,我们使用索引来做到这一点。确保它可以工作比它“看起来不错”更重要(即使它看起来不错显然更好)。

于 2011-10-27T12:13:51.493 回答