Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWTP Presenter prepareFromRequest-将数据加载到从事件检索的表单中_Gwt_Gwtp - Fatal编程技术网

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

GWTP Presenter prepareFromRequest-将数据加载到从事件检索的表单中,gwt,gwtp,Gwt,Gwtp,在过去的几周里,我一直在尝试GWTP,并用它构建了一个小项目 问题是: 我有一个网格小部件(附带的屏幕截图),它显示了一个数据列表。选中一行的复选框并单击编辑请求,我进入一个详细信息页面 由于我已经在summary screen presenter本身的详细信息页面中显示了所有数据(模型),所以我不想再次从数据库中获取它 因此,我做了以下工作: 在选择并单击“编辑请求”时,我将获得所选模型 向详细信息页面发出位置请求 触发编辑事件,并将所选模型作为参数传递 我知道我做错了,因为当我选择一个项目并

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

问题是:

我有一个网格小部件(附带的屏幕截图),它显示了一个数据列表。选中一行的复选框并单击编辑请求,我进入一个详细信息页面

由于我已经在summary screen presenter本身的详细信息页面中显示了所有数据(模型),所以我不想再次从数据库中获取它

因此,我做了以下工作:

  • 在选择并单击“编辑请求”时,我将获得所选模型
  • 向详细信息页面发出位置请求
  • 触发
    编辑事件
    ,并将所选模型作为参数传递 我知道我做错了,因为当我选择一个项目并点击编辑请求时,详细信息页面还没有收到所选项目。它只显示一个空白页,没有填充任何数据(显然,因为在事件触发之前已经到达了该位置)

    当前代码:

    RequestModel selectedItem = getView().getGrid().getSelectionModel().getSelectedItem();
    
    PlaceRequest placeRequest=new PlaceRequest(NameTokens.initiationedit);  
    getEventBus().fireEvent(new RequestEditEvent(selectedItem, PHASE_INITIATION));
    
    placeManager.revealPlace(placeRequest);
    
    个人想法解决方案:我可以使用所选项目的
    id
    参数发出placerequest,然后覆盖
    useManualReveal
    prepareFromRequest
    从数据库获取新数据,而不是触发事件

    但是有没有一种方法可以避免对预先存在的数据调用数据库

  • 如果要保留当前的“RequestEditEvent”解决方案,请确保使用
    @ProxyEvent
    (请参阅)

  • 另一种可能是颠倒事件的方向:在您的详细信息演示者中,触发一个事件,请求概览演示者提供数据

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


  • 根据@Chris Lercher的回答,我使用了ProxyEvent。实施细节如下

    在我的
    RequestEditPresenter
    (详细信息演示器)中,我实现了事件处理程序
    RequestEditHandler
    ,如中所示

    public class RequestEditPresenter extendsPresenter<RequestEditPresenter.MyView, RequestEditPresenter.MyProxy> implements RequestEditHandler{
    
    @Override
    @ProxyEvent
    public void onRequestEdit(RequestEditEvent event) {
    
        getView().setModelToView(event.getRequestModel());
    
        ...various other initiation process...
    
        placeManager.revealPlace(new PlaceRequest(NameTokens.initiationedit));
    }
    

    因为详细信息演示者是一个
    场所
    ,所以我使用了placeManager。对于没有
    NameToken
    的演示者,只需现场调用
    forceReveal()
    方法即可。我使用了ProxyEvent,工作起来很有魅力。为了完整起见,让我补充一下细节