我们可以让“prepareFromRequest”表现得像传统的非Ajax页面一样吗?

时间:2014-03-21 14:48:58

标签: gwt gwtp

好的,让我们看看传统的非Ajax页面是如何工作的。假设您有一个类似以下链接的页面

abc.com#!search;item=car

在传统的非Ajax网站中,当您第一次拨打" abc.com#!search;item=car"时,它将转到服务器并获取数据。之后,您将转到其他页面,例如" abc.com#!customer;name=tom"然后你按回按钮它会回到" abc.com#!search;item=car"。但是,这次它不会再次打电话给服务器,因为它记得它以前做过的。

现在这是GWTP问题。假设上面的abc.com是用GWTP技术构建的。

当用户第一次进入" abc.com#!search;item=car"时,GWTP应用程序将初始化页面"搜索"通过onBindprepareFromRequest将被调用&它会去服务器获取数据。

那很好,没问题。但是,如果我们使用revealPlace打开一个新页面(如客户页面),那么我们点击后退按钮它将返回"搜索"页面&它会再次拨打prepareFromRequest。然后prepareFromRequest将再次对服务器进行完全相同的调用。这不好浪费资源。

所以我想要" prepareFromRequest"仅在我们初始化页面时调用(在onBind之后运行)&阻止" prepareFromRequest"在所有其他页面请求中(例如用户按下后退按钮)。

意思是" prepareFromRequest"应该像上面提到的传统的非Ajax页面一样工作。

我们可以这样做吗?或

你有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

如果您已经拥有该特定搜索字词的搜索结果,并且只有在后端发出更改后才发出呼叫,那么为什么不办理prepareFromRequest方法?

这样的事情:

public Presenter extends .... {

    String searchItem = null;
    List<DTO> searchResult = null;

    @Override
    public void prepareFromRequest(PlaceRequest placeRequest) {
        super.prepareFromRequest(placeRequest);
        String item = placeRequest.getParameter("item",null));
        if (searchItem == null || !searchItem.equals(item)) {
            searchItem = item;
            // MAKE A CALL TO THE BACKEND AND STORE THE DATA IN A FIELD. 
            searchResult = GET_FROM_SERVER(searchItem);
       }
    }
}