0

カスタムコンポーネントがあります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

4

1 に答える 1

1

これは、「readonly」属性がtrueに設定されていることに関係している可能性があります。変更イベントを手動(JS)で送信することはできますが、読み取り専用状態のため、リスナーのサーバー側の処理がドロップされる場合があります。たとえば、jsf(richfaces)読み取り専用入力テキスト検証を参照してください。

于 2012-09-19T19:49:58.147 に答える