Обновление элемента в DataProvider for Grid и реализация метода getId в Vaadin 8 - PullRequest
0 голосов
/ 26 сентября 2018

Метод DataProvider::refreshItem, используемый Grid и другими виджетами, предлагает два альтернативных способа для виджета определить, какой из содержащихся элементов вы пытаетесь обновить:

  • Положитесь на реализации моих бинов equals и hashCode, надежно идентифицирующие один и тот же объект без зависимости от изменяемого поля члена (свойство).
  • Реализация getId

Чтобы процитировать JavaDoc:

void refreshItem(T item)

Обновляет данный элемент.Этот метод должен использоваться для информирования всех DataProviderListeners о том, что элемент был обновлен или заменен новым экземпляром.

Для правильной работы элемента необходимо реализовать Object.equals(Object) и Object.hashCode(), чтобы рассмотреть обастарые и новые экземпляры элемента должны быть равными или, альтернативно, getId(Object) должны быть реализованы для возврата соответствующего идентификатора.

Последнее предложение выше - сложная часть.

➥ У меня такой вопрос: Как реализовать DataProvider::getId?

Каждый пример DataProvider Я видел результаты в возвращении DataProviderдругими вызовами или внутренне сгенерированными, а не подклассами.Если обычный маршрут к DataProvider не включает создание подклассов при написании собственной реализации, то как можно переопределить getId для обеспечения реализации?

Ответы [ 2 ]

0 голосов
/ 13 октября 2018
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();
  }
}

Рабочий пример кода можно найти здесь .

0 голосов
/ 26 сентября 2018

При желании вы все равно можете создать свой собственный подкласс поставщика данных, хотя в большинстве примеров используются более удобные фабричные методы.Расширение от AbstractBackEndDataProvider или ListDataProvider обычно является лучшей отправной точкой.

Другой альтернативой является использование конструктора с тремя аргументами CallbackDataProvider, который принимает два регулярных обратных вызова в качестве первых двух аргументов, а затемтретий обратный вызов, который получает элемент и должен возвращать объект, который можно использовать в качестве идентификатора для этого элемента.

Прямое или косвенное переопределение getId рассматривается как относительно редко используемая функция, поэтому мы решили незагрязняют интерфейс верхнего уровня DataProvider фабричными методами для этих случаев.

...