8

私は gwt-platform を使用しており、GWT のエディター フレームワークを実装しようとしました。しかし、プレゼンター内からは機能しません。Web には、EditorDriver をプレゼンターに何らかの方法で挿入する必要があるという回答がいくつかありますが、これを行う方法がわかりません...

現時点では、これを試してみましたが成功しませんでした:

public class MyPresenter extends Presenter<MyPresenter.MyView, MyPresenter.MyProxy> implements MyUiHandlers {
    public interface MyView extends View, HasUiHandlers<MyUiHandlers>, Editor<MyModel> {}

    @ProxyStandard
    @NameToken(NameTokens.myPage)
    @NoGatekeeper
    public interface MyProxy extends ProxyPlace<MyPresenter> {} 

    interface Driver extends SimpleBeanEditorDriver<MyModel, MyView> {}
    private Driver editorDriver;
    DispatchAsync dispatcher;

    @Inject
    public MyPresenter(EventBus eventBus, MyView view, MyProxy proxy, DispatchAsync dispatcher) {
        super(eventBus, view, proxy);
        getView().setUiHandlers(this);
        this.dispatcher = dispatcher;

        MyModel m = new MyModel();
        m.setId(1L);
        m.setUsername("username");
        m.setPassword("password");

        editorDriver = GWT.create(Driver.class);
        editorDriver.initialize(this.getView());
        editorDriver.edit(m);
    }

    ...
}

ViewImplementation を明示的に指定すると機能しますが、それは MVP が機能する方法ではありません。

interface Driver extends SimpleBeanEditorDriver<MyModel, MyViewImpl> {}

...

editorDriver.initialize((MyViewImpl) this.getView());

誰かがそれを正しく行う方法の例を教えてくれたらうれしいです。

ありがとう

4

3 に答える 3

7

以前のバージョンのExpenses サンプルで使用されていたものと同様のアプローチが私にとってはうまくいきました。

ビューが実装するインターフェイス。プレゼンターが具体的なビューの実装を知る必要がないように、ワイルドカードが使用されます。

import com.google.gwt.editor.client.Editor;
import com.gwtplatform.mvp.client.View;

/**
 * Implemented by views that edit beans.
 *
 * @param <B> the type of the bean
 */
public interface BeanEditView<B> extends View, Editor<B> {

  /**
   * @return a new {@link SimpleBeanEditorDriver} initialized to run
   *         this editor
   */
  SimpleBeanEditorDriver<B, ?> createEditorDriver();
}

プレゼンターは次のようになります。

public class MyPresenter extends Presenter<MyPresenter.MyView, MyPresenter.MyProxy> implements MyUiHandlers {
    public interface MyView extends BeanEditView<MyModel>, HasUiHandlers<MyUiHandlers> {}

    @ProxyStandard
    @NameToken(NameTokens.myPage)
    @NoGatekeeper
    public interface MyProxy extends ProxyPlace<MyPresenter> {} 

    private SimpleBeanEditorDriver<MyModel, ?> editorDriver;
    DispatchAsync dispatcher;

    @Inject
    public MyPresenter(EventBus eventBus, MyView view, MyProxy proxy, DispatchAsync dispatcher) {
        super(eventBus, view, proxy);
        getView().setUiHandlers(this);
        this.dispatcher = dispatcher;

        MyModel m = new MyModel();
        m.setId(1L);
        m.setUsername("username");
        m.setPassword("password");

        editorDriver = getView().createEditorDriver();
    }

    ...
}

そして、ビューの実装:

public class MyViewImpl extends ViewWithUiHandlers<MyUiHandlers> implements
    MyPresenter.MyView {

  public interface Binder extends UiBinder<Widget, MyViewImpl> { }
  private static Binder uiBinder = GWT.create(Binder.class);

  /**
   * The driver to link the proxy bean with the view.
   */
  public interface EditorDriver extends SimpleBeanEditorDriver<MyModel, MyViewImpl> { }

  private final Widget widget;

  public MyViewImpl() {
    widget = uiBinder.createAndBindUi(this);
  }

  @Override
  public SimpleBeanEditorDriver<MyModel, ?> createEditorDriver() {
    EditorDriver driver = GWT.create(EditorDriver.class);
    driver.initialize(this);
    return driver;
  }

  @Override
  public Widget asWidget() {
    return widget;
  }

  ...
}

これは、GWT のエディター フレームワークを使用して MVP に到達できる限り近いものです。ビューの実装がモデルを認識しない方法を見つけることができませんでしたが、本当に必要だとは思いません。

誰かがこれについて改善した場合、私は喜んで聞いています。


GWT エディターに関する追加のコメントが見つかりました。モデルを完全に分離することは不可能なようです。Thomas Broyer は、編集者の別の質問に対する回答で次のように述べています。

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

于 2012-05-22T09:31:09.983 に答える
2

問題は、Driver.class が GWT.create に渡されることです。

editorDriver = GWT.create(Driver.class);

すべてのサブエディター、つまりすべての uibind ウィジェットを保持する具象クラスである必要があります。

1 つの解決策は次のとおりです。

ビュー インターフェイスは、Model オブジェクトのエディタ インターフェイスを拡張します。

public interface MyView extends View, ..., Editor<MyModel>

ビューの実装 MyViewImpl は、ドライバーの型を定義します

interface MyDriverImpl extends SimpleBeanEditorDriver<MyModel,MyViewImpl>

ドライバーは MyViewImpl でインスタンス化されます。

SimpleBeanEditorDriver<MyModel,MyView> driver = GWT.create(MyDriverImpl.class);

親タイプ

SimpleBeanEditorDriver<MyModel,MyView>

ドライバーの参照をプレゼンターに渡すために使用できます

于 2012-06-18T08:57:36.193 に答える
0

MVP は、プレゼンターを使用してモデルをビューから完全に分離すると述べています。さらに、あなたのアプローチはビュー内にロジックを配置していると思います...別の解決策があることを願っています;)

于 2012-05-22T10:55:08.793 に答える