如何在Vaadin Binder中确认验证

时间:2018-03-25 02:01:11

标签: java vaadin vaadin8

假设我在Bean bankAccount上进行了以下Binder验证:

binder.withValidator(bankAccount ->
{
    if(!bankAccount.hasEnoughMoneyForWithdrawal())
         return false;
    return confirmCustomerWillAcceptATMTransactionFee();
}, "Cannot withdraw money");

如何在继续操作之前确认客户是否接受此费用?我能看到的唯一返回用户反馈的对话框有一个回调方法,因此我似乎无法弄清楚如何在Binder中执行此操作?

2 个答案:

答案 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;
    }
}

<强>结果:

binder with confirmation window

答案 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的更改) )。