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ので、各ウィジェットはその を知ることができますが、ビューレイヤーはモデルを認識すべきではなく、「ボタン」と「ラベルのみであるべき」とGoogleが言っているのでPerson、全体のアイデアはMVP違反のように見えますValueAwareEditor"。

ここで正しいアプローチは何ですか?

4

1 に答える 1

2

どちらのアプローチでも構いません。

MVP は決まったものではありません (定義さえされていません。Martin Fowler によって造られましたが、彼はより具体的な 2 つのパターンを支持してこの用語を廃止しました)、あなたは自分自身に与えた規則に違反しているだけです。ValueAwareEditor別の言い方をすれば、エディター フレームワークは全体として MVP に違反していると見なすことができます。各エディターはモデルを認識しており、(またはのように)編集している正確なインスタンスを必ずしも認識していませんLeafValueが、少なくともエディターであるオブジェクトの種類を認識しています。

参考までに、インデックスを使用してそれを行います。「見た目が良い」ことよりも、動作が保証されていることの方が重要です(見た目良い場合は明らかに優れていますが)。

于 2011-10-27T12:13:51.493 に答える