私はajaxを持つ複合コンポーネントを持っています:
<composite:interface>
<composite:attribute name="question" required="true"/>
<composite:attribute name="value" required="false"/>
<composite:attribute name="id" required="true" />
<composite:clientBehavior name="alter"
event="change" targets="input"/>
</composite:interface>
<composite:implementation>
<label for="#{cc.attrs.id}">
<h:outputText value="#{cc.attrs.question}" />
</label>
<div class="fld">
<h:selectOneRadio value="#{cc.attrs.value}" id="input">
<f:selectItem itemValue="true" itemLabel="Yes" />
<f:selectItem itemValue="false" itemLabel="No" />
</h:selectOneRadio>
</div>
</composite:implementation>
この複合コンポーネントをページで次のように使用している場合:
<question:yesNo question="#{myMSG['knowRegQuestion']}" value="#{vehicle.regKnown}" id="is-reg-known">
<f:ajax event="alter" render="reg-unknown" />
</question:yesNo>
......
<h:panelGroup id="reg-unknown" styleClass="questionGroup man-veh-srch">
......
<h:selectOneListbox value="#{vehicle.model}" size="1" rendered="#{vehicle.regKnown eq 'true'}">
......
</h:selectOneListbox>
</h:panelGroup>
ajaxが起動し、モデルは正しく更新されていますが、レンダリングは変更されていません。(私はさまざまなEL式を試しました)また、Firebugではajax応答が正しく表示されません:
<?xml version='1.0' encoding='UTF-8'?>
<partial-response id="j_id1"><changes><update id="j_id1:javax.faces.ViewState:0"><![CDATA[-2911901889097730230:4227240037100614528]]></update></changes></partial-response>
私は何を逃しましたか?(ありがとう)
で指定されている相対クライアントIDは、コンポーネントツリーの<f:ajax render>
親ClientBehaviorHolder
コンポーネントを基準にして解決されます。あなたの特定のケースでは、これは実際には<h:selectOneRadio>
です。reg-unknown
したがって、クライアントIDを持つコンポーネント<h:selectOneRadio>
は、<cc:implementation>
それ自体であると同じ名前付けコンテナーの親で検索されます(複合コンポーネントが実装することはすでにご存知でしょうNamingContainer
)。ただし、目的のコンポーネントはそこにありません。
代わりに絶対クライアントIDを指定することをお勧めします(したがって、で始まる:
ので、に関連して検索されますUIViewRoot
)。これは、2つの一般的な方法で実現できます。
それをハードコーディングします(これがすべてIDのフォーム内にあると仮定しますform
):
<h:form id="form">
<question:yesNo ...>
<f:ajax event="alter" render=":form:reg-unknown" />
</question:yesNo>
...
<h:panelGroup id="reg-unknown" ...>
...
</h:panelGroup>
</h:form>
参照UIComponent#getClientId()
(親ネーミングコンテナのIDが不明な場合):
<h:form ...>
<question:yesNo ...>
<f:ajax event="alter" render=":#{regUnknown.clientId}" />
</question:yesNo>
...
<h:panelGroup binding="#{regUnknown}" ...>
...
</h:panelGroup>
</h:form>
これは確かに厄介です。これはMojarraの問題1510として報告されたことがありますが、複合コンポーネント自体は複合コンポーネント以外の他のコンポーネントについて何も知らないはずなので、バグとは見なされませんでした(ただし、解決策は理論的には単純です。またはで<f:ajax render>
始まらない場合は、複合コンポーネントの親のクライアントIDをプレフィックスとして付けます)。:
@
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加