GWTP Presenter prepareFromRequest - 将数据加载到从事件中检索的表单中

时间:2012-12-28 08:27:00

标签: gwt gwtp

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

以下是问题:

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

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

所以,我做了以下事情:

  1. 在选择和点击编辑请求时,我会选择所选模型
  2. 向详细信息页面发出位置请求
  3. 触发edit event并将所选模型作为参数传递。
  4. 我知道我做错了,因为当我选择一个项目并点击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}}从数据库中获取新数据。

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

2 个答案:

答案 0 :(得分: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”。

答案 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()方法

即可