カスタムコンポーネントがありますlocation
。変更が行われるとモデルが更新されるため、別のコンポーネント(オートコンプリート)で値に関連する結果のみが表示されるようにしたいと思いlocation
ます。また、そのコンポーネントは再レンダリングされてリセットされます。
次のコード(簡略化)のページがあります。
<h:form id="ticketForm">
...
<loc:location id="locationId" <-- CUSTOM COMPONENT
hiddenFieldValue="#{ticketCtrl.ticket.location}"
visibleFieldValue="#{ticketCtrl.ticket.locationDescription}"
rendered="#{ticketCtrl.ticketModifiable}">
<f:ajax event="changeLocation" render=":ticketForm:gfhId" <-- AJAX CALL.
execute=":ticketForm:locationId" listener="#{ticketCtrl.locationListener}"/>
</loc:location>
...
</h:form>
コンポーネントの値が変更されると、モデルが更新:ticketForm:gfhId
され、必要に応じてレンダリングされますが、リスナー(追加のリセットを実行する)は実行されません。
より単純なコントロールにajaxをアタッチすると、リスナーが実行されます。vg
<h:inputText id="contactId"
value="#{ticketCtrl.ticket.contactPerson}"
disabled="#{not ticketCtrl.ticketModifiable}">
<f:ajax event="change" render=":ticketForm:gfhId"
execute=":ticketForm:locationId" listener="#{ticketCtrl.locationListener}"/>
</h:inputText>
完璧に動作します。
changeLocation
イベントがどのように発生したかと関係があるかどうかはわかりません。私のコンポーネントの中で私はそれを次のように定義します
<composite:interface>
...
<composite:clientBehavior name="changeLocation" event="change" targets="visibleId"/>
</composite:interface>
visibleId
読み取り専用のテキストです。javascriptによって変更されたchange
場合、JSを使用してイベントを発生させます。
function launchEvent(fieldName) {
if ("fireEvent" in fieldName) {
fieldName.fireEvent("onchange");
} else {
var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
fieldName.dispatchEvent(evt);
}
}
他の質問で見つけた情報は、ajaxを複合コンポーネントの内部部分にすることに関するものです。ここでは、コンポーネントの他の用途ではおそらく必要ないため、ajaxを切り離したいと思います。
私はJBoss6.1とMojarra2.1.9およびRichfaces4を使用しています。
前もって感謝します。
アップデート:
jarek.jpaの正解を見つけた後でも、誰かがコードを確認したい場合は、次のようになります。
複合コンポーネント http://pastebin.com/9wqMVfR5
メインフォーム http://pastebin.com/i39ys2D9