3

複合コンポーネントを作成しようとしています。composite:interfaceセクションで 4 つの属性を定義しました。ここにコードがあります

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite">

<composite:interface >
    <composite:attribute name="id" />
    <composite:attribute name="maxlength" />
    <composite:attribute name="required"/>
    <composite:attribute name="value" />
</composite:interface>

<composite:implementation  xmlns:kc="http://java.sun.com/jsf/composite/components/kaysComposite">
        <p:inputTextArea id="#{cc.attrs.id}" value="#{cc.attrs.value}" maxlength="#{cc.attrs.maxlength}" required="#{cc.attrs.required}" counterTemplate="{0} /  #{cc.attrs.maxlength}" counter="#{cc.attrs.id}_counter"/>

        <h:outputText id="#{cc.attrs.id}_counter"/>
</composite:implementation>
</html>

これは私のコンポーネントを使用するページです

     <kc:kaysInputTextArea id="gpAdres" value="#{someBean.variable}"   maxlength="250" required="true"/>
<p:message for="gpAdres" />

奇妙な部分は必須属性が機能しないことですが、他の部分は正常に機能します。なぜこのように振る舞うかはわかりませんでした。

4

4 に答える 4

4

(本当の答えではありませんが、コメントするには長すぎます。役立つかもしれないいくつかのアイデアを共有したかっただけです...必要に応じて編集または置き換えてください)

遭遇した動作について説明していないため、コンポーネント内の値は、渡した値で変化しないと推測しています。

同じ設定で同様の問題がありましたが、「true」または「false」を直接(例のように)渡したところ、うまくいきました。EL 式を渡した場合にのみ、式の評価結果に関係なく、コンポーネント内の値が設定されなくなります。私の場合、属性に明示的なタイプを設定しました。たとえば、type="java.lang.Boolean"この定義を削除するとうまくいきました。

私の推測では、属性にブール値を期待させると、ELを処理できず、ブール値のデフォルト値に解決されます(default="false"設定されていない限り、これはtrueのようです)。

タイプを設定しないことで、コンポーネントは EL を保持し、それを次のターゲット (h:tag のレンダリングされた属性など) に渡すことができるようです。

あなたの正確な問題ではないようですが、問題を追跡するのに役立つかもしれませんか?

于 2012-09-25T14:59:11.310 に答える
0

私も一度、部品の挙動がおかしくなった経験があります。の値IDに問題があることが判明しました

<composite:attribute name="id" />

そのため、属性の名前をidentに変更してみてください。たぶん、requiredまたはのような他の一般的に名前が付けられた属性valueも問題です...

私が経験した具体的でさらに面白い状況は次のとおりです。

<composite:attribute name="id" requred="true" />

働きました。のタイプミスに注意してくださいrequredidタイプミスを修正すると、コンポーネントは機能しなくなり、必要なマーク付き属性として値を指定したにもかかわらず、値を指定しなかったと不平を言いました。解決策は、複合属性の名前を変更することでした。

<composite:attribute name="ident" required="true" />
于 2013-07-07T08:43:49.703 に答える
0

別の属性を使用してみてください: id は複合タグ用に予約されているため、これを試してください:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite">

<composite:interface >
    <composite:attribute name="inputTextId" />
    <composite:attribute name="maxlength" />
    <composite:attribute name="required"/>
    <composite:attribute name="value" />
</composite:interface>

<composite:implementation  xmlns:kc="http://java.sun.com/jsf/composite/components/kaysComposite">
        <p:inputTextArea id="#{cc.attrs.inputTextId}" value="#{cc.attrs.value}" maxlength="#{cc.attrs.maxlength}" required="#{cc.attrs.required}" counterTemplate="{0} /  #{cc.attrs.maxlength}" counter="#{cc.attrs.id}_counter"/>

        <h:outputText id="#{cc.attrs.inputTextId}_counter"/>
</composite:implementation>
</html>
于 2013-09-25T10:39:00.870 に答える
0

このアプローチを使用できます。

<kc:kaysInputTextArea id="gpAdres" value="#{someBean.variable}"   maxlength="250" required="true" rendered="#{yourBooleanExpression}"/>
<kc:kaysInputTextArea id="gpAdres" value="#{someBean.variable}"   maxlength="250" required="false" rendered="#{!yourBooleanExpression}"/>

これはハックですが、機能します)

于 2013-06-20T08:29:46.487 に答える