2016-09-02 52 views
1

我有一个结合了标签,一个文本框和一个错误的标签一Macrocomponent ...ZK MVVM验证消息自动绑定?

<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

您能发布java验证部分吗?我的想法是从ValidationContex.getBindContext()。getComponent()获取组件的id,并通过组件id管理错误。当然,它只适用于每个组件都有设置的ID。 – barracus

+0

有错误作为属性的宏组件有一个id,在那里没有问题。子成员也有,但当然总是一样的。验证部分至今还没什么特别的,只是一些简单的AbstractValidators检查和添加消息。 –

回答

1

针对此问题的解决方案实际上是相当简单:

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

这允许绑定错误字段vmsgs [self.id],它在上述情况下将河北vmsgs [“产品名”],哪些工作。

它只有当我栈这些组件的多个成另一种macrocomponent开始变得复杂...

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

...因为那样的话,原始组件不再是myComponent的,但“外” macrocomponent ,这样self.id(产品名称,产品类型)将不够用。这可以通过给出验证明确重点来处理......

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

...但我们是有问题,验证器将不会独立mycomponents(谁仍然期待id作为验证信息工作键)。

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