Vaadin Binder仅在保存时设置Bean及撤销功能实现咨询
Vaadin Binder实现带撤销功能的表单解决方案
核心问题解决方案
1. Binder初始化方式
要实现“修改暂存、保存才更新原Bean、撤销放弃修改”的需求,需利用Binder的草稿模式(Draft Mode)。初始化时先将原始Bean的数据加载到表单,同时启用草稿模式,用户在表单中的修改会暂存在Binder草稿中,不会直接改动原Bean。
正确初始化代码:
private MyBean myBean; // 预先加载好初始数据的实体类实例 private Binder<MyBean> binder = new Binder<>(MyBean.class); private void initBinder() { // 启用草稿模式,表单修改暂存,不直接写入原Bean binder.setBeanAsDraft(myBean); // 将原Bean的初始值加载到所有绑定的表单字段 binder.readBean(myBean); // 正常绑定字段(示例) binder.forField(inputField) .bind(MyBean::getValue, MyBean::setValue); // 其他字段绑定逻辑同理... }
2. 保存方法获取更新后的Bean
保存时先验证表单数据有效性,验证通过后将Binder草稿中的修改写入原Bean,此时原Bean即为更新后的状态,直接用于数据库存储即可。
正确保存方法:
private void save() { try { // 将草稿中验证通过的数据写入原Bean binder.writeBean(myBean); // 此时myBean已更新,直接执行数据库保存逻辑 // saveToDatabase(myBean); } catch (ValidationException e) { // 处理验证失败逻辑,如弹出提示 Notification.show("表单验证失败,请检查输入内容"); } }
3. 撤销方法实现
撤销时只需将原Bean的初始数据重新加载到表单,同时清空Binder的草稿,表单会自动恢复到初始状态,原Bean不会被修改。
正确撤销方法:
private void cancel() { // 重新加载原Bean的初始值到表单,自动清空草稿 binder.readBean(myBean); // 无需手动设置单个字段值,readBean会同步所有绑定字段 }
原代码问题分析
- 初始化逻辑错误:
binder.writeBeanAsDraft(myBean)是将表单数据写入草稿,而非加载初始数据,应改用setBeanAsDraft启用草稿模式后,再用readBean加载初始值。 - 保存方法逻辑混乱:
binder.readBean(myBean)是将Bean数据同步到表单,不是“获取更新后的Bean”,正确操作是用writeBean将草稿内容写入原Bean,之后直接使用原Bean即可。 - 撤销方法冗余:无需手动设置单个字段值,
readBean(myBean)会自动同步所有绑定字段的初始状态。
内容的提问来源于stack exchange,提问作者AleXeNoN
相关产品推荐
相关产品推荐

