我认为您走在正确的轨道上,使弹出窗口自成一体,并在您可以提供帮助的情况下仅保留它的一个实例。
至于编辑器的细节,什么是没有意义的?一般的想法是,您可以创建一次驱动程序,使用弹出窗口(实现编辑器)对其进行初始化,然后在每次准备好使用新模型显示它时调用驱动程序上的编辑。
我通常会得到类似的结果(假设类扩展了 Popup,实现了编辑器,并在内部定义了驱动程序)
public MyPopup() {
//uibinder or other layout
this.driver = GWT.create(Driver.class);
driver.initialize(this);
}
public void edit(MyModel model) {
driver.edit(model);
show();
}
为了用我自己的方法/偏见来调整这个答案,我喜欢一个 MVP 设置,其中视图和演示者都是接口,并且演示者 impl 不知道视图最终将如何绘制。对我来说一般看起来像这样
public interface MyModelEditorView extends Editor<MyModel> {
// this param is used in a mobile/table situation, where popups aren't as friendly
void show(AcceptsOneWidget parent);
// exposes the driver for the presenter *
SimpleBeanEditorDriver<MyModel, ?> getDriver();
void setPresenter(Presenter presenter);
public interface Presenter {
// this is the only method that is called externally
void show(AcceptsOneWidget parent, MyModel model);
// called by click handlers in the view impl, probably by @UiHandler methods
void onSaveClicked();
void onCancelClicked();
}
}
* Presenter 可能应该控制驱动程序,以便它可以检查错误、在需要时从服务器传递错误、编辑新模型并清除结果。