假设我在Bean bankAccount上进行了以下Binder
验证:
binder.withValidator(bankAccount ->
{
if(!bankAccount.hasEnoughMoneyForWithdrawal())
return false;
return confirmCustomerWillAcceptATMTransactionFee();
}, "Cannot withdraw money");
如何在继续操作之前确认客户是否接受此费用?我能看到的唯一返回用户反馈的对话框有一个回调方法,因此我似乎无法弄清楚如何在Binder中执行此操作?
答案 0 :(得分:2)
您的问题缺少一些信息,所以我尽可能地填补了空白。
您可以在下面找到一个可能的解决方案,其中包含模态窗口和回调,基于另一个验证器,以布尔字段的形式检查“虚拟”费用确认。
使用用户在表单中输入正确且完整的信息时禁用保存按钮,并且唯一的“错误”尚未接受费用(您可以避免添加活页夹状态{ {1}}如果您不想看到该表单,但效果仍然相同)
<强>豆:强>
Rating Cycle 1 Standard Survey Health Date
确认窗口:
Label
<强>形式:强>
// simple pojo for binding
public class BankAccount {
private int currentAmount;
public BankAccount(Integer currentAmount) {
this.currentAmount = currentAmount;
}
public Integer getCurrentAmount() {
return currentAmount;
}
public boolean hasEnoughMoneyForWithdrawal(Integer withdrawalAmount) {
return currentAmount >= withdrawalAmount;
}
}
<强>结果:强>
答案 1 :(得分:1)
请参阅活页夹验证的生命周期。
https://vaadin.com/api/8.3.2/com/vaadin/data/Binder.html处的Binder文档说“可以使用withValidator(Validator)方法添加Bean级别验证器,并且一旦从绑定字段的值更新了绑定bean,就会在绑定的bean上运行.Bean级别验证器如果所有字段级验证器都通过,它们也作为writeBean(Object)和writeBeanIfValid(Object)的一部分运行。“
如果他/她接受交易费用,您可能不希望每当活页夹发生变化时都会向用户询问。
我会考虑在writeBeanIfValid成功后使用对话框询问确认https://vaadin.com/api/8.3.2/com/vaadin/data/Binder.html#writeBeanIfValid-BEAN-
请注意,这个想法仅适用于使用readBean https://vaadin.com/api/8.3.2/com/vaadin/data/Binder.html#readBean-BEAN-而不是setBean,这意味着您使用缓冲模式(binder不直接将更改写入bean)而不是unbuffered模式(直接写入bean的更改) )。