1

gwtのドキュメントで提案されているように、アプリケーションを作成するときはMVPデザインパターンに従うようにしています。単純なツリーを使用する場合、ドキュメントのは単純明快であり、MVPとgwtの良い例になります。この例では、ビューが作成され、データがビューに渡されて表示されます。私が理解している限り、これはビュー、モデル、プレゼンターを分離しておくための正確な方法です。

CellTreeを使用すると、データの入力はTreeViewModelのデータプロバイダー内で行われます。データプロバイダーをセルツリーの外に持ち出すことはできないため、ビューにあるセルツリーの内部にすべてのデータを入力する必要があります。ここで、ビューはモデルについて知る必要があり、MVPパターンが壊れています。ユーザーに表示する前にセルツリーにデータを動的に入力したくないので、セルツリーのデータを編集して、後で別の形式で保存する必要があります。

私の質問は、MVPデザインパターンでCellTree、または一般的にCellウィジェットを実装する方法について説明します。

4

2 に答える 2

2

MVPでCellTableを使用しました。

UI:

<g:HTMLPanel>
    <g:ScrollPanel>
        <p1:CellTable ui:field="cellTable" width="100%" styleName="style.cellTable" height="100%" />
    </g:ScrollPanel>
</g:HTMLPanel>

ビュー インターフェイス:

public interface SomeCellListView extends IsWidget {
    void setPresenter(Presenter listener);

      // Method to set the CellTable data
    void setCellList(ArrayList<ObjectDTO> list);

    public interface Presenter {
        void goTo(Place place);
        void doSomething(int id);
    }
}

ビューの実装:

   public class SomeCellListViewImpl extends Composite implements SomeCellListView {

... all Ui Binder stuff here

@UiField(provided = true)
CellTable<ObjectDTO>cellTable = new CellTable<ObjectDTO>();

SomeCellListViewImpl(){
    TextColumn<ObjectDTO> someColumn= new TextColumn<ObjectDTO>(){
        @Override
        public String getValue(ObjectDTO o) {
            return o.getSomeFieldValue();
        }
    };
    cellTable.addColumn(someColumn, "column1");

    ... add other columns here
}

// This method is called from Presenter to set CellTable data
public void setCellList(ArrayList<ObjectDTO> list) {
    cellTable.setRowCount(list.size(), true);
    cellTable.setRowData(0, list);
}

}

アクティビティ (またはプレゼンター):

// コンストラクターでビューとサービスを設定 (ClientFactory からビューを取得)

public void start(AcceptsOneWidget containerWidget, EventBus eventBus) {

// Make RPC call
this.service
.getCellList(new AsyncCallback<ArrayList<ObjectDTO>>(){

    @Override
    public void onFailure(Throwable caught) {
        view.setError("Error fetching details");
    }

    @Override
    public void onSuccess(ArArrayList<ObjectDTO> result) {
        view.setCelllist(result);
    }

});
view.setPresenter(this);
containerWidget.setWidget(view.asWidget());

}

ここで、ビューはすでに ClientFactory によって作成されています。ビューには、CellTable のレイアウトのみが含まれています。ビューの作成時にデータがロードされません。アクティビティ (別名プレゼンター) が開始されると、「開始」メソッドが呼び出されます。ここでは、Cell データを取得する RPC を作成し、ビューでメソッドを呼び出してデータを設定します。

私はCellTreeを使用していません。しかし、あなたはセルウィジェットについて一般的に尋ねました。したがって、これを共有することを考えました。お役に立てれば。

于 2012-05-09T17:01:10.367 に答える
0

OPにも同じ問題があります。MVP チュートリアルのパート II を読み、MVP アーキテクトを維持しながら、アプリケーションで CellTable を使用しようとしました。しかし、私はその部分で混乱しています: チュートリアルでは Presenter のような構文を使用していますが、なぜ Presenter のみを使用するのですか?

于 2012-05-12T02:27:15.020 に答える