2

パラメータに基づいてinputTextとinputSecretの使用を切り替えるFacelets複合コンポーネントを作成しています。

<composite:interface>
    <composite:attribute name="myId" required="true"/>
    <composite:attribute name="secret" required="false" default="false" />
</composite:interface>

<composite:implementation>
    <h:inputSecret rendered="#{cc.attrs.secret}" id="#{cc.attrs.myId}" />
    <h:inputText rendered="#{!cc.attrs.secret}" id="#{cc.attrs.myId}" />
</composite:implementation>

問題は、次のエラーが発生することです。

コンポーネント ID [JSF mangled id] はビューで既に見つかりました。

4

2 に答える 2

4

JSTL のようなビューのビルド時間タグを使用する<c:if><c:choose>、JSF コンポーネントのrendered属性の代わりに使用します。ビューのビルド時のタグは、JSF コンポーネント ツリーの構築中に評価されますが、rendered 属性は、JSF コンポーネント ツリーに基づいて HTML を生成するときにのみ評価されます (したがって、JSF コンポーネント ツリー内で両方のコンポーネントが同じ ID を持つことになります!) .

例えば

<c:if test="#{not cc.attrs.secret}">
    <h:inputText id="input" />
</c:if>
<c:if test="#{cc.attrs.secret}">
    <h:inputSecret id="input" />
</c:if>

以下も参照してください。


具体的な問題とは無関係myIdで、意味がありません。それらに固定IDを与えるだけです。外部から ajax で参照できないことが原因の場合は、f:ajax render で複合コンポーネント IDを参照するに進みます。

于 2012-08-14T20:06:26.190 に答える
0

コンポーネントが実際にレンダリングされるかどうかは問題ではありません。どちらのコンポーネントもビューの内部コンポーネント ツリーに存在し、一意の ID が必要です。この問題にも遭遇しました。

id の末尾に _1 と _2 を付けました。javaScript 内で id を取得する必要がある場合は、JQuery の部分マッチャーを使用します。

あなたの場合、bean の getMyId() メソッドがシークレット プロパティの値に基づいて別の ID を返すようにできませんか?

于 2012-08-14T19:57:24.743 に答える