【问题标题】:gwt cellTable caching on client side客户端的 gwt cellTable 缓存
【发布时间】:2013-10-07 15:50:08
【问题描述】:

我打算创建一个单元格表来显示来自数据库的联系人信息。 我要显示的表格有很多行。

目前我设法轻松地显示数据。 我唯一的问题是,当我在寻呼机中更改页面时。 gwt 一次又一次地发送数据请求,即使我之前已经请求过这些页面!

如何让客户端缓存?

p.s 这里是 onRangeChanged 的​​一段代码:

AsyncDataProvider<Contact> provider = new AsyncDataProvider<Contact>() {
  @Override
  protected void onRangeChanged(HasData<Contact> display) {
    int start = display.getVisibleRange().getStart();
    int end = start + display.getVisibleRange().getLength();
    end = end >= DBHelper.size() ? DBHelper.size() : end;
    List<Contact> sub = DBHelper.get(start, end);
    updateRowData(start, sub);        
  }
};

编辑:

Churro 建议我将创建一个帮助类(如 DBHelper)来缓存一些结果,这就是我将如何跳过数据库访问的方式。那不是我想要的,我打算在客户端有一个缓存,帮助类仍然不会为我保存客户端->服务器调用。

【问题讨论】:

    标签: gwt caching gwt-celltable


    【解决方案1】:

    您应该实现一个类来帮助在客户端进行缓存。它将充当您的服务接口 (DBHelper) 和您的 CellTable 之间的一层。它将管理 RPC 请求,并且仅在需要刷新数据时进行 RPC 调用。否则,它将从某个缓存结构(如Map)返回缓存数据。

    实施后,您的AsyncDataProvider 将调用CacheImpl.get(start, end); 而不是DBHelper.get(start, end)

    【讨论】:

    • @Urbanleg 如果您只想获取一次数据,然后翻阅检索到的数据,则必须使用ListDataProvider 类而不是AsyncDataProvider。您仍然可以进行 RPC 调用,然后将结果发送到 ListDataProvider,它将同步处理分页和排序。
    【解决方案2】:

    为了帮助记忆,我使用了一个 EntityWindow,它的作用是保持之前的两个范围并提前获取两个范围。通过这种方式,您可以限制缓存在内存中的对象数量,并在后台获取接下来的两个对象,以使下一页更快。在加载时,您可以获取渲染视图所需的数据,并在后台获取 2x 或 3x display.getVisibleRange().getLength() 实体,以便立即加载下一个按钮。当用户单击下一步时,您可以获取未来的元素并删除以前的元素。

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 2017-03-18
      • 2012-07-26
      • 2019-04-24
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多