2012-02-24 60 views
2

我們有一個創建爲JSF 2組件的文本輸入組件,它封裝了標籤和編輯字段(h:inputText),並且它還負責佈局。 我們現在的問題是讓inputField的validator屬性暴露在我們的複合組件上。我們在cc:interface部分聲明瞭屬性,但在cc:implementation中聲明內部h:inputText時添加validator="#{validator}"的問題是,如果未使用該字段,它將在運行時失敗。如何將驗證器屬性傳遞給來自JSF2複合組件的h:inputText?

我想以與h:inputText相同的方式執行此操作,而無需註冊自定義驗證器。

這種類型的問題有一些已知的解決方案嗎?我們嘗試創建一個用於複合組件內部的自定義標籤,但它過於複雜,並且最終沒有奏效,所以我想問問專家是否有這樣一種簡單的方法。

注意:我想在複合組件的validator屬性中使用方法綁定表達式,就像h:inputText的原始一樣。 感謝您的幫助!

回答

0

我有幾個組件具有特定的掩碼,驗證和轉換器。

首先,我定義了一個名爲「defaultText」這樣的成分:

</cc:interface> 
    <cc:attribute name="value"/> 
    <cc:editableValueHolder name="mycomp" targets="input"/> 
</cc:interface> 
<cc:implementation> 
    <p:inputMask id="input" value="#{cc.attrs.value}"/> 
</cc:implementation> 

(有我讓出來,以節省空間各種屬性)。看到editableValueHandler?它是你定義什麼組件來連接你的轉換器/驗證器的地方。

所以,我用我的 'defaultText' 組件來構建其它組分,例如, 'text.xhtml':

</cc:interface> 
    <cc:attribute name="value"/> 
    <cc:attribute name="mask"/> 
    <cc:attribute name="jsfConverter"/> 
    <cc:attribute name="jsfValidator"/> 
</cc:interface> 
<cc:implementation> 
    <foo:defaultText id="dt" value="#{cc.attrs.value}" mask="#{cc.attrs.mask}"> 
     <c:if test="#{!empty cc.attrs.jsfConverter}"> 
      <f:converter converterId="#{cc.attrs.jsfConverter}" for="mycomp"/> 
     </c:if> 
     <c:if test="#{!empty cc.attrs.jsfValidator}"> 
      <f:validator validatorId="#{cc.attrs.jsfValidator}" for="mycomp"/> 
     </c:if> 
    </foo:defaultText> 
</cc:implementation> 

<composite:editableValueHolder>定義任何驗證/轉換器(<f:validator for="mycomp">)將被關聯到<p:inputMask id="input">

然後我用我的文本組件上我的網頁:

<foo:text value="#{dummyMBean.text}" mask="99.999-99" jsfConverter="..." jsfValidator="..."/> 
相關問題