我有一个组合了标签,文本框和错误标签的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中找到它吗?
答案 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,可能不是最佳解决方案,但至少是解决方案。