【问题标题】:Vaadin 11: refreshAll (again)Vaadin 11:刷新所有(再次)
【发布时间】:2018-12-04 22:26:09
【问题描述】:

here 是关于 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 范围内的新 Product 实例:

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

所以重点是,这不起作用 - 单击“刷新”后,网格中的数据仍然相同。

有什么建议吗?

问候,

m_OO_m

【问题讨论】:

    标签: vaadin vaadin11


    【解决方案1】:

    这是由几天前的bug that was fixed 引起的。该修复将包含在下一个维护版本中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 2013-01-10
      • 2019-11-26
      相关资源
      最近更新 更多