変更時に再レンダリングする h:textInput を取得しようとしています。a4j:ajax と f:ajax で試しました。
a4j:ajax を使用する場合:
<h:panelGroup id="xyzPG">
<ui:repeat var="var" ... >
...
<h:inputText id="#{idController.getIdXYZ(var.id)}"
value="#{someModel.value}"
size="3"
styleClass="#{errorController.getErrorStateStyleId(idController.getIdXYZ())}">
<a4j:ajax event="change" render="xyzPG" listener="#{listener.doSomeStuff}" />
</h:inputText>
...
</ui:repeat>
</h:panelGroup>
これは、パネルがモデルの更新を初めて停止したときにパネルが更新された後、初めて機能し、リスナーも呼び出されません。ただし、レンダリングがトリガーされ、古い値が表示されます。
a4j:ajax を f:ajax に置き換えると、xyzInput 内に ID xyzPG が見つからないというエラー メッセージが表示されます。
<f:ajax event="change" render="@this" listener="#{listener.doSomeStuff}" />
再レンダリングをinputTextに制限しようとすると、常にモデルが更新され、リスナーが呼び出されますが、h:inputTextは再レンダリングされません。
inputText の周りに別の panelGroup を配置しようとしましたが、それもうまくいきませんでした。
h:dataTable を使用しない理由は、次のレイアウトでテーブルを作成する必要があるためです。
----------------------------
| dataSet1 | dataSet 2 |
----------------------------
| dataSet3 | dataSet 4 |
etc...
したがって、ui:repeat のオフセットおよびステップ属性を使用しています。