2016-09-02 53 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,可能不是最好的解決方案,但至少是一個解決方案。