在Vaadin 8中刷新DataProvider for Grid中的项目,并实现`getId`方法。

时间:2018-09-25 21:02:47

标签: vaadin vaadin8

Grid和其他窗口小部件使用的DataProvider::refreshItem方法为窗口小部件提供了两种替代方法,以标识您要刷新的包含项中的哪些:

  • 依靠我的bean的equalshashCode实现,可靠地标识同一对象,而无需依赖可变成员字段(属性)。
  • 实施getId

引用JavaDoc:

  

void refreshItem(T item)

     

刷新给定的项目。应该使用此方法来通知所有DataProviderListener某项已被更新或被新实例替换。

     

为使此方法正常运行,该项目必须实现Object.equals(Object)Object.hashCode()才能将旧项目实例和新项目实例都视为相等,或者应实施getId(Object)返回适当的标识符。

上面的最后一条是棘手的部分。

➥我的问题是:如何实施DataProvider::getId

每个DataProvider的示例我都看到结果是DataProvider由其他调用返回,或者在内部生成,而不是子类化。如果到DataProvider的常规路由在编写您自己的实现时不涉及子类化,那么一个人如何覆盖getId来提供实现?

2 个答案:

答案 0 :(得分:2)

即使您愿意,您仍然可以创建自己的数据提供程序子类,即使大多数示例使用更方便的工厂方法。从AbstractBackEndDataProviderListDataProvider扩展通常是最好的起点。

另一种选择是使用CallbackDataProvider的三参数构造函数,该构造函数将两个常规回调作为前两个参数,然后将第三个回调接收一个项目,并应返回一个可用作对象的对象。该项目的标识符。

直接或间接覆盖getId被视为一种相对很少使用的功能,因此对于这些情况,我们选择不使用工厂方法来污染顶级DataProvider界面。

答案 1 :(得分:0)

public class EmployeeDataProvider extends AbstractBackEndDataProvider<Employee, String> {
  private static final long serialVersionUID = 1L;
  private final EmployeeService employeeService;

  public EmployeeDataProvider(EmployeeService employeeService) {
// TODO Auto-generated constructor stub
    this.employeeService = employeeService;
  }

  @Override
  protected Stream<Employee> fetchFromBackEnd(Query<Employee, String> query) {
// TODO Auto-generated method stub
    return employeeService.fetchEmployees(query.getFilter().orElse(null), query.getLimit(), query.getOffset(),
        query.getSortOrders()).stream();
  }

  @Override
  protected int sizeInBackEnd(Query<Employee, String> query) {
// TODO Auto-generated method stub
    return employeeService.countEmployees(query.getFilter().orElse(null));
  }

  @Override
  public Object getId(Employee item) {
// TODO Auto-generated method stub
    return item.getId();
  }
}

您可以找到有效的示例代码here