Vaadin 14 GridPro 元素不反映 UI 中的变化
Vaadin 14 GridPro element does not reflect change in UI
我正在为 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 中没有更新,它仍然显示旧值。渲染器正确 returns 新值,ValueProvider 也正确设置新文本值。
你至少以过于复杂的方式设置它。 Java 8 允许您使用这样的几行代码在 GridPro
中设置文本字段。假设你有 Grid<Person>
和 Person#getFirstName
returns 的名字和 Person#setFirstName
分别是 setter 和 属性,你只需要这个。不需要调用 DataProvider#refreshItem
,因为 GridPro
也会在内部调用。
grid.addEditColumn(Person::getFirstName)
.text((item, newValue) -> item.setFirstName(newValue))
.setHeader("First name");
在 documentation 中查看更多示例。
问题是我用作 GridPro 的类型参数的 POJO 没有不变的 ID,因此 dataProvider.refreshItem 无法在支持集中找到它并更新它。有关详细信息,请参阅 https://vaadin.com/forum/thread/18453090/grid-with-editor-can-t-save-changed-data。
我正在为 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 中没有更新,它仍然显示旧值。渲染器正确 returns 新值,ValueProvider 也正确设置新文本值。
你至少以过于复杂的方式设置它。 Java 8 允许您使用这样的几行代码在 GridPro
中设置文本字段。假设你有 Grid<Person>
和 Person#getFirstName
returns 的名字和 Person#setFirstName
分别是 setter 和 属性,你只需要这个。不需要调用 DataProvider#refreshItem
,因为 GridPro
也会在内部调用。
grid.addEditColumn(Person::getFirstName)
.text((item, newValue) -> item.setFirstName(newValue))
.setHeader("First name");
在 documentation 中查看更多示例。
问题是我用作 GridPro 的类型参数的 POJO 没有不变的 ID,因此 dataProvider.refreshItem 无法在支持集中找到它并更新它。有关详细信息,请参阅 https://vaadin.com/forum/thread/18453090/grid-with-editor-can-t-save-changed-data。