ZK MVVM验证邮件自动绑定?

时间:2016-09-02 09:14:01

标签: java mvvm zk

我有一个组合了标签,文本框和错误标签的Macrocomponent ......

<mycomponent id="productname" caption="Product name" value="Apple XYZ" error=""/>

...现在我想用它来绑定...

显然我可以写......

<mycomponent id="productname" caption="Product name" value="@bind(vm.productName)" error="@bind(vmsgs['productname'])"/>

(当然,上面某处有一个validationMessages="@id('vmsgs') - 正确的注释已经到位,所以这个绑定工作正常)

...但当然,我必须为每个字段执行此操作,这会使我的.zul文件混乱。那么,有没有机会以某种方式,甚至在java代码中,告诉组件将自己绑定到具有组件id的vmsgs,而不必为每个字段赋予它?所以这会产生同样的效果......

<mycomponent id="productname" caption="Product name" value="@bind(vm.productName)"/>

..或者

<mycomponent id="productname" caption="Product name" value="@bind(vm.productName)" bindError="true"/>

当然,组件应该在非MVVM环境中保持可用,因此可能会添加固定绑定。例如,如果我们以某种方式绑定并自动添加我们自己的绑定,那么有机会在Java中找到它吗?

1 个答案:

答案 0 :(得分:1)

这个问题的解决方案实际上非常简单:

@ComponentAnnotation("@bind(vmsgs[self.id])")
public void setError(String value) {
    this.error.setValue(value);
}

这允许将错误字段绑定到vmsgs [self.id],在上面描述的情况下,它将是vigs ['productname'],它可以工作。

当我将多个这些组件堆叠到另一个宏组件中时,它才开始变得复杂......

<zk>
     <mycomponent id="productname" caption="Product name" value="@bind(vm.productName)"
     <mycomponent id="producttype" caption="Product type" value="@bind(vm.productTye)"
</zk>

...因为那时,原始组件不再是mycomponent,而是“外部”宏组件,因此self.id(productname,producttype)是不够的。这可以通过在验证器中给出显式键来处理......

SavePropertyBinding binding = (SavePropertyBinding)ctx.getBindContext().getBinding();
String fieldName = binding.getFieldName();

...但是我们遇到了问题,验证器不能与独立的mycomponents一起使用(他们仍然期望id作为验证器消息密钥)。

嗯,这是一个开始,通过使用自定义注释,我教我的验证器识别使用哪个ID,可能不是最佳解决方案,但至少是解决方案。