如何使用MVP模式创建CellTree

时间:2012-05-09 12:11:36

标签: gwt

正如gwt文档中所建议的那样,我尝试在创建应用程序时遵循MVP设计模式。使用简单树时,文档中的example是直截了当的,并且是MVP和gwt的良好示例。在该示例中,创建视图并将数据提供给要显示的视图。据我所知,这正是将视图,模型和演示者分开的方法。

使用CellTree,填充数据发生在TreeViewModel的数据提供程序中。数据提供者不能被带到单元树之外,因此我需要在视图中的单元树内填充所有数据。现在,视图需要知道模型并且MVP模式被破坏了。在向用户显示数据之前,我不想动态地将数据填充到单元树中,我需要编辑单元树中的数据并稍后将其保存为不同的格式。

我的问题是如何在MVP设计模式中实现CellTree或一般的Cell小部件?

2 个答案:

答案 0 :(得分:2)

我已经将CellTable与MVP结合使用。

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的布局。创建视图时不会加载数据。当Activity启动时(也称为Presenter),将调用“start”方法。在这里,我们使RPC获取Cell数据并在视图中调用方法来设置数据。

我没有使用过CellTree。但是你总体上问过Cell小部件。因此想到分享这个。希望这会有所帮助。

答案 1 :(得分:0)

我和OP有同样的问题。我阅读了MVP教程第二部分,然后尝试在我的应用程序中使用CellTable,同时仍然保留MVP架构师。但我对这部分感到困惑:教程使用像Presenter这样的语法,但为什么你只使用Presenter?