刷新 DataProvider for Grid 中的项,并在 Vaadin 8 中实现"getId"



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以提供实现?

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

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

直接或间接覆盖getId被视为相对较少使用的功能,因此在这些情况下,我们选择不污染工厂方法的顶级DataProvider接口。

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();
}
}

您可以在此处找到工作示例代码。

最新更新