MVP和GWT小部件之间的通信

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

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

class PersonDetails { private PetDetails pet; private AddressDetails addressDetails; // ... } 

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

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

 interface EditPersonSession { void fetchPerson(PersonId id); PersonDetails getCurrentPersonDetails(); void updatePersonDetail(PersonDetail detail); void updatePetDetail(PetDetail detail); void updateAddressDetail(AddressDetail detail); void save(); } 

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

 view.getStreetNameTextBox().addValueChangeHandler(new ValueChangeHandler() { void onValueChange(ValueChangeEvent event) { editPersonSession.updateAddressDetail(new StreetNameAddressDetail(event.getValue())); } } 

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

 view.getSaveButton().addClickHandler(new ClickHandler() { void onClick(ClickEvent event) { editPersonSession.save(); } } 

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

如果您查看来自Google IO 2009的Ray Ryan 演示文稿的第42页,您应该找到问题的解决方案。 您使用“事件总线”( HandlerManager共享实例)并触发自定义PetDetailsChangedEvent事件并从子窗口小部件中侦听该事件(第45页)。 此外,请记住,虽然解耦,等等很好,所有, 一些耦合并不是一件坏事,实际上可能是一个更好的解决方案,而不是试图强迫一切松散耦合–RR在演示中自己说:)

我还得出结论,我可以拥有一个与每个演示者相对应的模型。 因此,PetWidget可以创建Pet实例,PersonWidget可以创建Person实例。 PersonWidget然后可以包含一个或多个PetWidgets,这反过来意味着Person类可以具有Pet实例的列表。