4

在过去的几周里,我一直在尝试 GWTP,并用它构建了一个小项目。

这是问题:

我有一个显示数据列表的网格小部件(附加屏幕截图)。在选择一行的复选框并单击 时Edit Request,我进入了详细信息页面。 摘要页面

由于我有所有数据(模型)要显示在摘要屏幕演示器本身的详细信息页面中,因此我不想再次从数据库中获取它。

所以,我做了以下事情:

  1. 在选择并单击编辑请求时,我得到了选定的模型
  2. 向详细信息页面发出地点请求
  3. 触发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);

个人认为的解决方案:我可以使用所选项目的参数发出一个 placerequest,而不是触发一个事件,id然后覆盖useManualRevealprepareFromRequest以从数据库中获取新的数据。

但是有没有办法可以避免数据库调用预先存在的数据。

4

2 回答 2

1
  1. 如果您想保留当前的“RequestEditEvent”解决方案,请务必使用@ProxyEvent(请参阅http://code.google.com/p/gwt-platform/wiki/GettingStarted?tm=6#Attaching_events_to_proxies)。

  2. 另一种可能性可能是反转事件的方向:在您的详细信息演示者中,触发一个向概览演示者请求数据的事件。

  3. 但是,当跨多个演示者使用相同的数据时,将数据保存在中央模型中可能是一个好主意:创建一个模型类(@Singleton)并将其注入您需要的任何地方。然后,您可以从该本地模型进行查找(通过 id),而不是询问服务器。在这种情况下,您不需要任何事件——只需要某处的 id,例如作为位置参数,甚至作为模型中的“currentItemId”。

于 2012-12-28T12:29:10.070 回答
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。对于没有 a 的演示者NameToken,只需调用该forceReveal()方法

于 2012-12-28T18:09:46.370 回答