【问题标题】:Vaadin 14 GridPro element does not reflect change in UIVaadin 14 GridPro 元素不反映 UI 的变化
【发布时间】:2021-12-23 23:11:34
【问题描述】:

我正在为 CustomField 使用 GridPro 组件。网格由 ListDataProvider 提供支持。网格初始化如下:

this.grid.addEditColumn(new ValueProvider<Item, String>() {

    private static final long serialVersionUID = 1L;

    @Override
    public String apply(final Item source) {
        return (String)source.get(prop.getName());
    }
}, new TextRenderer<Item>(new ItemLabelGenerator<Item>() {

    private static final long serialVersionUID = 1L;

    @Override
    public String apply(final Item item) {
        String val = (String)item.get(prop.getName());
        return StringTools.isValidString(val) ? val : "";
    }

})).text(new ItemUpdater<Item, String>() {

    private static final long serialVersionUID = 1L;

    @Override
    public void accept(final Item item, final String newValue) {
        Item dataProviderItem = (Item)dataProvider.getId(item);
    dataProviderItem.set(prop.getName(), newValue);
TableField.this.dataProvider.refreshItem(dataProviderItem);
    }
}).setHeader(prop.getName());

我遇到的问题是,当我编辑一个单元格时,它的内容在 UI 中没有更新,它仍然显示旧值。渲染器正确返回新值,ValueProvider 也正确设置了新文本值。

【问题讨论】:

  • 你的意思是当客户端提交对字段的更改(进入或点击外部)时,客户端的值恢复到原来的值?
  • 是的,没错。即使渲染器正确返回了新值,客户端值(即 UI 中的单元格显示的内容)也会恢复为之前的值。

标签: vaadin vaadin-flow vaadin-grid vaadin14


【解决方案1】:

问题是我用作 GridPro 的类型参数的 POJO 没有不变的 ID,因此 dataProvider.refreshItem 无法在支持集中找到它并更新它。详情请见https://vaadin.com/forum/thread/18453090/grid-with-editor-can-t-save-changed-data。

【讨论】:

    【解决方案2】:

    您至少是以过于复杂的方式设置它。 Java 8 允许您在 GridPro 中设置文本字段,只需像这样的几行代码。假设你有 Grid&lt;Person&gt; 和 Person#getFirstName 返回名字,Person#setFirstName 分别是属性的设置器,你只需要这个。不需要调用DataProvider#refreshItem,因为GridPro 也会在内部执行此操作。

    grid.addEditColumn(Person::getFirstName)
            .text((item, newValue) -> item.setFirstName(newValue))
            .setHeader("First name");
    

    在documentation 中查看更多示例。

    【讨论】:

    • 不幸的是,我需要这个过于复杂的解决方案,因为我将整个数据集支持在具有未确定结构的项目上。不过,您在这里提供了解决方案:vaadin.com/forum/thread/18453090/… 并且该项目没有不变的 ID,因此 dataProvider.refreshItem 将能够找到它并刷新它。我创建了一个简单的 POJO,它具有不变的 ID,并将其用作 GridPro 的类型参数,它工作正常。谢谢
    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 2023-03-03
    • 2012-02-10
    • 2019-10-15
    • 2023-03-31
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    相关资源
    最近更新 更多