过去几周我一直在尝试GWTP并用它来构建一个小项目。
以下是问题:
我有一个网格小部件(附带的屏幕截图),显示了一个数据列表。选择行的复选框并单击Edit Request
后,我会进入详细信息页面。
由于我将所有数据(模型)显示在摘要屏幕演示者本身的详细信息页面中,因此我不想再次从数据库中获取它。
所以,我做了以下事情:
edit event
并将所选模型作为参数传递。 我知道我做错了,因为当我选择一个项目并点击Edit Request
时,详细信息页面还没有收到所选项目。它只显示一个没有填充数据的空白页(显然,因为在事件被触发之前已经到达了很多位置)。
当前代码:
RequestModel selectedItem = getView().getGrid().getSelectionModel().getSelectedItem();
PlaceRequest placeRequest=new PlaceRequest(NameTokens.initiationedit);
getEventBus().fireEvent(new RequestEditEvent(selectedItem, PHASE_INITIATION));
placeManager.revealPlace(placeRequest);
个人认为的解决方案:我可以使用所选项id
的参数进行地方请求,而不是触发事件,然后覆盖useManualReveal
和{{ 1}}从数据库中获取新数据。
但有没有办法可以避免数据库调用预先存在的数据。
答案 0 :(得分:1)
如果您想保留当前的“RequestEditEvent”解决方案,请务必使用@ProxyEvent
(请参阅http://code.google.com/p/gwt-platform/wiki/GettingStarted?tm=6#Attaching_events_to_proxies)。
另一种可能是颠倒事件的方向:在您的详细信息演示者中,触发一个从概述演示者请求数据的事件。
但是,在多个演示者中使用相同的数据时,最好将数据保存在中央模型中:创建模型类(@Singleton)并将其注入所需的任何位置。然后,您可以从该本地模型进行查找(通过id),而不是询问服务器。在这种情况下,您不需要任何事件 - 只是某处的ID,例如作为场所参数,甚至是模型中的“currentItemId”。
答案 1 :(得分:0)
根据@Chris Lercher的回答,我使用了ProxyEvent。具体实施细节如下。
在我的RequestEditPresenter
(详情演示者)中,我实现了事件处理程序RequestEditHandler
,如
public class RequestEditPresenter extendsPresenter<RequestEditPresenter.MyView, RequestEditPresenter.MyProxy> implements RequestEditHandler{
然后在同一RequestEditPresenter
覆盖RequestEditHandler
中的方法,而不是
@Override
@ProxyEvent
public void onRequestEdit(RequestEditEvent event) {
getView().setModelToView(event.getRequestModel());
...various other initiation process...
placeManager.revealPlace(new PlaceRequest(NameTokens.initiationedit));
}
由于详细信息演示者是Place
,我使用了placeManager。对于没有NameToken
的演示者,只需调用forceReveal()
方法