一、Input Validator
<textbox value="@save(vm.account.email, before='save') @validator(vm.emailValidator)"/>
当绑定组件的属性到一个validator,在保存数据到绑定的目标之前绑定器将会自动调用它去验证属性值。如果验证失败,ViewModel(or middle object)的属性将保持不变。
(1)@bind(vm.account.email)@validator(vm.emailValidator)
保存时机:触发组件属性相关事件,如onChange for value。
验证时机:立即验证单一域;当执行一个command时不会验证。
验证失败:不会保存数据。
(2)@load(vm.account.email) @save(vm.account.email,before= 'save') @validator(vm.emailValidator)
保存时机:执行command之前。
验证时机:触发指定的command时,验证所有域;当用户在单一域输入后不会验证。
验证失败:不会保存数据,并且不会执行command。
二、双重验证
<groupbox form="@id('fx') @load(vm.selected) @save(vm.selected, before='saveOrder') @validator(vm.formValidator)">
<grid hflex="true" >
<columns>
<column width="120px"/> <column/>
</columns>
<rows>
<row>Quantity
<intbox value="@bind(fx.quantity) @validator(vm.quantityValidator)"/>
</row>
</rows>
</grid>
</groupbox>
第一次验证:在用户输入后立即验证。
第二次验证:当执行command前验证,可以验证输入为空的情况。
三、Validation Message Holder
在执行完validation之后,validator会将验证信息存储在validation message holder里面。如果要使用,必须在validationMessages属性上,通过@id(‘vmsgs’)指定它的id来初始化,之后就可以引用这个id,展示验证信息。
(1)组件自身作为key
<textbox id="tb1" value="@bind(vm.value1) @validator(vm.validator1)" />
<label id="m1" value="@bind(vmsgs[tb1])"/>
<!--可以通过tb1组件本身,而不是’tb1’id作为key-->
(2)自定义key<textbox id="t41" value="@bind(fx.value1)"/>
<label id="l41" value="@bind(vmsgs['fkey1'])"/>
(3)显示多条验证信息(只能在ZK EE 6.0.1版本以上使用)
可以从Validation Message Holder的特殊属性texts中取得所有信息。
vmsgs.texts和vmsgs[‘texts’]是一样的,所以要避免使用texts作为自定义的key.
<div id="formdiv" form="... @validator('fooValidator')">
...
</div>
<grid id="msggrid" model="@bind(vmsgs.texts[formdiv])" visible="@bind(not empty vmsgs.texts[formdiv])">
<template name="model" var="msg">
<row>
<label value="@bind(msg)" />
</row>
</template>
</grid>
四、实现validator
可以通过实现Validator接口或者继承AbstractValidator类实现
(1)单一属性验证
一次验证一个属性。最简单的方法就是继承AbstractValidator并重写validate方法。addInvalidMessage没有指定key,所以把validator绑定的组件对象作为key
(2)依赖属性验证
验证当前属性需要另一个属性值。需要使用@save(vm.p, before=’command’)方式
在shippingDateValidator验证类中,shipping date是验证的主要属性,验证它需要依赖另一个属性creation date。
主要属性获取方式:ctx.getProperty().getValue()
依赖属性获取方式:ctx.getProperties("依赖的属性")[0].getValue()
(3)form上的依赖属性验证
要在form属性上应用validator,而不是在input组件上。
当使用Form绑定,主要的属性是一个Form,所以需要指定key来获取Form下的所有属性。
获取方式:(自从6.0.1后可以通过ValidationContext.getProperties(Object))
另一种,取得bean的所有属性:
五、使用参数验证
六、应用级别的验证器(只有一个实例,在所有绑定器间共享)
使用方式:
七、内置的验证器
通过@validator(‘validatorName’)直接使用
(1)beanValidator
这个验证器集成JavaBean验证框架,定义了一个元数据模型和API来验证javabean
开发人员可以通过Java注释和验证bean API指定bean属性的约束
通过使用ZK的bean验证器,您只需要指定bean的属性限制然后bean验证器将调用API来验证JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator
在pom.xml使用:
在project classpath下:
使用:在JavaBean的属性上通过Java注解添加约束
页面:通过validator的name--beanValidator来调用
(2)formBeanValidator
像Bean验证器,这个验证器也将结合JavaBean验证并验证Bean的所有保存属性
使用:
通过验证器的name并通过prefix属性,设置一个独特的前缀。
当验证失败,会使用prefix+propertyName作为key。