Vaadin 11:refreshAll(再次)
Vaadin 11: refreshAll (again)
是关于 Vaadin 8.5.1 上 DataProvider.refreshAll() 的一个很好的线程,但它在 Vaadin 11 中似乎无法以这种方式工作。
我用this starter app来玩。它在网格中显示一些虚构的产品数据。
一开始我给SampleCrudView添加了一个刷新命令:
public HorizontalLayout createTopBar() {
...
HorizontalLayout topLayout = new HorizontalLayout();
Button btn = new Button("refresh");
btn.addClickListener(event -> dataProvider.refreshAll());
topLayout.add(btn);
...
return topLayout;
}
来自 vaadin 的人像这样在他们的 ProductDataProvider 中覆盖 getId() 以将其用作对象标识符:
@Override
public Integer getId(Product product) {
Objects.requireNonNull(product,
"Cannot provide an id for a null product.");
return product.getId();
}
ProductDataProvider 扩展了 ListDataProvider,它在启动时使用来自 MockDataService 的数据进行初始化,因此我们总是处理相同的对象。我改变了:
public class MockDataService extends DataService {
...
@Override
public synchronized List<Product> getAllProducts() {
//added ->
MockDataGenerator.resetProductCounter(); //this one sets nextProductId = 1
products = MockDataGenerator.createProducts(categories);
products.stream().forEach(p -> System.out.println(p.getId() + ", " + p.getProductName()));
//<- added
return products;
}
所以现在你每次调用 getAllProducts():
时都会在相同的 ID 范围内 获得新的产品实例
public class ProductDataProvider extends ListDataProvider<Product> {
...
@Override
public Stream<Product> fetch(Query<Product, SerializablePredicate<Product>> query) {
//added ->
this.getItems().clear();
this.getItems().addAll(DataService.get().getAllProducts());
//<- added
return super.fetch(query);
}
所以重点是,这不起作用 - 单击 "refresh" 后网格中的数据仍然相同。
有什么建议吗?
此致,
m_OO_m
这是几天前 bug that was fixed 引起的。该修复将包含在下一个维护版本中。
我用this starter app来玩。它在网格中显示一些虚构的产品数据。
一开始我给SampleCrudView添加了一个刷新命令:
public HorizontalLayout createTopBar() {
...
HorizontalLayout topLayout = new HorizontalLayout();
Button btn = new Button("refresh");
btn.addClickListener(event -> dataProvider.refreshAll());
topLayout.add(btn);
...
return topLayout;
}
来自 vaadin 的人像这样在他们的 ProductDataProvider 中覆盖 getId() 以将其用作对象标识符:
@Override
public Integer getId(Product product) {
Objects.requireNonNull(product,
"Cannot provide an id for a null product.");
return product.getId();
}
ProductDataProvider 扩展了 ListDataProvider,它在启动时使用来自 MockDataService 的数据进行初始化,因此我们总是处理相同的对象。我改变了:
public class MockDataService extends DataService {
...
@Override
public synchronized List<Product> getAllProducts() {
//added ->
MockDataGenerator.resetProductCounter(); //this one sets nextProductId = 1
products = MockDataGenerator.createProducts(categories);
products.stream().forEach(p -> System.out.println(p.getId() + ", " + p.getProductName()));
//<- added
return products;
}
所以现在你每次调用 getAllProducts():
时都会在相同的 ID 范围内 获得新的产品实例 public class ProductDataProvider extends ListDataProvider<Product> {
...
@Override
public Stream<Product> fetch(Query<Product, SerializablePredicate<Product>> query) {
//added ->
this.getItems().clear();
this.getItems().addAll(DataService.get().getAllProducts());
//<- added
return super.fetch(query);
}
所以重点是,这不起作用 - 单击 "refresh" 后网格中的数据仍然相同。
有什么建议吗?
此致,
m_OO_m
这是几天前 bug that was fixed 引起的。该修复将包含在下一个维护版本中。