2012-02-24 10 views
2

ラベルと編集フィールド(h:inputText)の両方をカプセル化し、レイアウトを処理するJSF 2コンポーネントとして作成されたテキスト入力コンポーネントがあります。 現時点での問題は、inputFieldのバリデータプロパティを複合コンポーネントで公開することです。 cc:interfaceセクションで宣言された属性がありますが、cc:implementationの内部h:inputTextを宣言するときにvalidator="#{validator}"を追加する際の問題は、フィールドが使用されていないときに実行時にエラーが発生することです。ValidatorプロパティをJSF2コンポジットコンポーネントからh:inputTextに渡すにはどうすればよいですか?

カスタムバリデーターを登録しなくても、h:inputTextと同じ方法でこれを実行したかったのです。

このタイプの問題の解決方法はありますか?私たちはコンポジットコンポーネント内で使用されるカスタムタグを作成しようとしましたが、複雑すぎて最後には機能しませんでしたので、簡単な方法があるかどうかを専門家に尋ねました。

注:h:inputTextの元のように、複合コンポーネントのvalidatorプロパティにメソッドバインディング式を使用します。 助けてくれてありがとう!

答えて

0

私は、特定のマスク、バリデーション、コンバーターを持ついくつかのコンポーネントを持っていました。

</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> 

(私はスペースを節約するために出していますいくつかの他の属性があります):

まず、私はこのような「defaultText」と呼ばれるコンポーネントを定義しました。 editableValueHandler?を参照してください。コンバーター/バリデーターをどのコンポーネントにリンクするかを定義します。 <composite:editableValueHolder>任意のバリ/ Aコンバータ(<f:validator for="mycomp">)は<p:inputMask id="input">に関連するように定義

</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> 

だから、私は、例えば、 'text.xhtml' の他の構成要素を構築するために、私の 'defaultText' コンポーネントを使用しました。

それから私は自分のページに自分のテキストコンポーネントを使用します。

<foo:text value="#{dummyMBean.text}" mask="99.999-99" jsfConverter="..." jsfValidator="..."/> 
関連する問題