允许使用者输入几乎是每个系统都需要的功能,为了确保资料内容或格式的正确性,通常会加上一些资料验证规则来确保使用者输入是符合预期的,以下介绍几种 zk 的输入验证方法。
每个输入元件都支援 constraint
属性,你可以指定许多内建的验证规则。例如,先前所提的英雄列表范例中,我不允许英雄的名字为空字串。
我可以这麽做:
<textbox id="newNameBox" ... constraint="no empty: 不能为空字串"/>
可指定多个规则:
<datebox constraint="no empty, no future: now or never"/>
可自定 regular expression 来验证:
<textbox constraint="/.+@.+\.[a-z]+/: e-mail address only"/>
ZK 内建 constraint 是在浏览器端由 JavaScript 实作来验证。
如果内建规则不能满足,例如要验证的是自订的业务逻辑,则可自行实作 Constraint
:
public class EvenNumberConstraint implements Constraint {
public void validate(Component comp, Object value) throws WrongValueException {
if (value != null && Integer.valueOf(value.toString()).intValue() % 2 == 1)
throw new WrongValueException(comp, "Only even numbers are allowed, not "+value);
}
}
然後指定给某个输入元件:
<?taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c"?>
<textbox constraint="${c:new('quickstart.validate.EvenNumberConstraint')}"/>
上面这个例子,我用了ZK 内建的 tag library 来产生一个新物件。
如果你已经用了 client端 constraint,又需要在服务器验证,就可用 onChange
倾听器做验证:
public class ValidateComposer implements Composer {
@Override
public void doAfterCompose(Component comp) throws Exception {
if (comp instanceof Textbox){
comp.addEventListener(Events.ON_CHANGE, event -> {
Textbox box = (Textbox) comp;
if (box.getValue().length() <= 1){
throw new WrongValueException(box, "至少要超过一个字");
}
});
}
}
}
WrongValueException
,传入的字串就是会显示在画面上的错误讯息box
传进 WrongValueException
,错误讯息才会显示在 <textbox>
上用 apply 套在元件上:
<textbox constraint="no empty" apply="quickstart.validate.ValidateComposer"/>
这是另一种实作控制器的方法:只实作 Composer
介面,覆写 doAfterCompose()
即可。通常用在你要对元件加上客制化行为时,而实作在一个特定的控制器可以让你很容易地套用在不同元件上,又可以轻易地拿掉。
另一种做法就是继承 ZK 内建的验证类别,然後加上自订的验证规则:
public class YouthConstraint extends SimpleConstraint {
/* 初始化念间规则 */
public YouthConstraint(int flags) {
super(flags);
}
/* 自订验证规则 */
@Override
public void validate(Component comp, Object value) throws WrongValueException {
if (value != null && Integer.valueOf(value.toString()).intValue() >=18)
throw new WrongValueException(comp, "必须小於 18");
}
}
在控制器中指定要用的验证规则:
public class YouthValidationComposer implements Composer {
@Override
public void doAfterCompose(Component component) throws Exception {
if (component instanceof Intbox){
Intbox box = (Intbox) component;
box.setConstraint(new YouthConstraint(SimpleConstraint.NO_NEGATIVE+
SimpleConstraint.END_AFTER));
}
}
}
套在元件上时,要加上一个空的 onChange
倾听器,让元件把值送到服务器:
<intbox apply="quickstart.validate.YouthValidationComposer" onChange=""/>
参考:
今天要接触我们的Javascript,让网页更多动画,互动性,不是一个只有图片跟文字的死板网页,而J...
问题回答 slot(插槽)的概念是把外层的内容塞进子元件的指定位置里。跟插槽的字面意思一样,前提是:...
最近看了很多好书,看完的共通感想是,为什麽以前没人推荐我看这些?如果早点看,不知道可以少走多少弯路。...
今天要来介绍 gulp-sass 如何安装与使用 gulp-sass 介绍 https://www....
相信大家使用网站时,一定会遇到大大小小固有或弹出的提示框,这次的主题就是他! 提示框在用户经验上会以...