【发布时间】:2015-08-21 17:26:49
【问题描述】:
这个问题不一定是 GWT 有界的,但另一方面,这正是我尝试正确使用它的原因。
我在 GWT 中使用 MVP 模式(推荐),但我不确定如何处理模型和视图,也不确定如何创建对服务器。特别想知道
- 在哪里初始化
MyView?演示者是在构造函数中自己执行此操作,还是接收到有效引用作为构造函数的参数? - 与
MyModel相同。由于MyModel的实例可能在不同的演示者之间共享,我想它应该传递给演示者的构造函数。 - 如何在 Presenter 中向服务器发出请求?我是否有一个额外的层来处理我的请求,或者是否建议在那里也使用
MyServletAsync?
我很难找出一个好的设计。请参阅下面的示例代码,该示例代码显示了我现在的操作方式:
public class MyPresenter implements MyView.MyPresenter
private final MyServletAsync myService = MyServlet.Util.getInstance();
private MyModel myModel;
private MyView myView;
public MyPresenter(MyView myView, MyModel myModel) {
this.myView = myView;
this.myModel = myModel;
// Register click handler ..
this.myView.getNextXyzButton.addClickHandler(
new ClickHandler() {
@Override
public onClick(Event event) {
requestXyz(this.myModel.getXyz().getOffset() + 1);
}
});
this.myView.getPrevisousXyzButton.addClickHandler(
new ClickHandler() {
@Override
public onClick(Event event) {
requestXyz(this.myModel.getXyz().getOffset() - 1);
}
});
// Initialize Xyz with offset 0
requestXyz(0);
}
/*
* Should I do this here in the presenter or should I
* create another layer that handles requests?
*/
private void requestXyz(final int byOffset) {
myService.getXyzFromServer(byOffset, new AsyncCallback<XyzDto>() {
@Override
public void onSuccess(XyzDto result) {
updateModelWithResult(result);
}
@Override
public void onFailure(Throwable caught) {
displayError(caught);
}
});
}
private updateModelWithResult(Xyz result) {
this.myModel.setXyz(result);
this.myView.displayXyz(result);
}
private displayError(Throwable caught) {
// ..
}
}
感谢您的建议。
【问题讨论】:
-
mvp 模式在“gwt in action”一书中也有描述。看第15章的示例代码如何使用mvpmanning-source.com/books/tacy/gwtinaction2.zip对我帮助很大