MVP和GWT小部件之间的通信

Art*_*hur 5 java architecture mvp gwt

如果我在GWT中使用MVP模式,就像在GWT架构中从2009年的Google I/O谈起最佳实践,但是将信息分散到多个小部件中,应该如何填充值对象?

假设我有一个EditPersonView/Presenter,一个EditPetView/Presenter和一个EditAddressView/Presenter,最后两个是小部件,作为EditPersonView中面板的一部分.有了这些我有以下课程:

class PersonDetails {
    private PetDetails pet;
    private AddressDetails addressDetails;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

PetDetails和AddressDetails实例变量在其演示者对应物中进行管理.当用户单击EditPersonView中的"保存"按钮时,如何完成窗口小部件之间的通信,以便PersonDetails充满来自其子窗口小部件的信息?

Dan*_*iel 1

我在使用 Ray Ryan 的方法设计的几个不同的 GWT 应用程序中也遇到了同样的问题。我的首选解决方案是创建一个单例“会话对象”来存储应用程序该部分的状态。在您的示例中,它可能如下所示:

interface EditPersonSession {

    void fetchPerson(PersonId id);
    PersonDetails getCurrentPersonDetails();
    void updatePersonDetail(PersonDetail<?> detail);
    void updatePetDetail(PetDetail<?> detail);
    void updateAddressDetail(AddressDetail<?> detail);
    void save();

}
Run Code Online (Sandbox Code Playgroud)

所有三个演示者都包含对会话对象的引用(可能由 Gin 注入)。每当用户操作 UI(视图)时,与该视图关联的演示者就会立即将状态推送到共享会话对象。例如,在 EditAddressPresenter 内部:

view.getStreetNameTextBox().addValueChangeHandler(new ValueChangeHandler() {

    void onValueChange(ValueChangeEvent<String> event) {
        editPersonSession.updateAddressDetail(new StreetNameAddressDetail(event.getValue()));
    }

}
Run Code Online (Sandbox Code Playgroud)

当需要保存时,状态对象被告知将状态保存到服务器。此时,会话对象具有最新的数据表示,并且可以一次性保存所有数据。因此,在 EditPersonPresenter 中:

view.getSaveButton().addClickHandler(new ClickHandler() {

    void onClick(ClickEvent event) {
        editPersonSession.save();
    }

}
Run Code Online (Sandbox Code Playgroud)

这样,呈现者不需要包含任何彼此的引用,但可以向服务器发送一致的信息。如果呈现器需要知道它们显示的信息何时已更新(由其他呈现器或服务器更新),则会话对象可以通过在事件总线(共享 Singleton HandlerManager)上触发事件来通知它们。然后,演示者可以从会话对象中提取最新的 PersonDetails。