GWT Editors框架 – ListEditor,删除项目,MVP违规

public class PersonListEditor extends Composite implements IsEditor<ListEditor> { private static PersonListEditorUiBinder uiBinder = GWT.create(PersonListEditorUiBinder.class); interface PersonListEditorUiBinder extends UiBinder {} private class Source extends EditorSource { @Override public PersonListItemWidget create(int index) { PersonListItemWidget widget = new PersonListItemWidget(); panel.insert(widget, index); return widget; } } @UiField VerticalPanel panel; private ListEditor editor = ListEditor.of(new Source()); public PersonListEditor() { initWidget(uiBinder.createAndBindUi(this)); } @Override public ListEditor asEditor() { return editor; } } 

PersonListItemWidget有一个Delete按钮,单击此按钮时,我需要从列表中删除相关项。

  1. 我可以使PersonListEditor监听项目小部件的通知(例如“我的删除按钮被点击”),但在这种情况下,我只会引用小部件,而不是我需要的真正的Person对象。 我也可以添加一些逻辑来从面板项列表中获取相关的widget索引,然后通过该索引获取Person对象,但这看起来很糟糕。

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

这里的方法是什么?

两种方法都没问题。

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

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