我正在使用gwt-platform,并尝试实现GWT的编辑器框架。但我不能让它在演示者内部工作。网上有一些答案,说我必须以某种方式将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());如果有人能给我一个如何做正确的例子,我会很高兴。
谢谢
发布于 2012-05-22 17:31:10
一种与早期版本的Expenses sample中使用的方法类似的方法对我有效:
视图应该实现的接口。使用通配符是为了让演示者不需要知道具体的视图实现:
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在his answer中对另一个编辑问题所说的:
"MVP不是一成不变的(它甚至没有定义;它是由Martin Fowler创造的,但他为了两个更具体的模式而放弃了这个术语),所以你只是违反了你给自己的规则。换句话说,编辑器框架作为一个整体可以被视为违反了MVP:每个编辑器都知道模型,不一定是它正在编辑的确切实例(比如ValueAwareEditor或LeafValue),但至少知道它所编辑的对象的类型。“
发布于 2012-06-18 16:57:36
问题是传递给GWT.create的Driver.class
editorDriver = GWT.create(Driver.class);必须是包含所有子编辑器的具体类,即所有uibinded窗口小部件。
一种解决方案如下:
视图接口扩展了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-05-22 18:55:09
MVP说您使用presenter将模型与视图完全分离。此外,我要说的是,您的方法将逻辑放在视图中...我希望有另一种解决方案;)
https://stackoverflow.com/questions/10694589
复制相似问题