私はdatatable/ajaxの問題の解決策を見つけようとしています(要するに):
<h:panelGroup layout="block" styleClass="ptl-body" id="toRender">
<h:dataTable value="#{flightMBean.flights}" var="f" id="flight_table" styleClass="table table-striped table-bordered">
<h:column>
<f:facet name="header">Airline</f:facet>
<h:outputText value="#{f.airline.name}"/>
</h:column>
...
<h:column>
<f:facet name="header">Status</f:facet>
<span class="label label-success">Approved </span>
<sec:authorize ifAnyGranted="ROLE_USER, ROLE_ADMIN">
<h:form>
<h:commandButton action="#{userMBean.observeFlight(f.id)}"
styleClass="btn purple" value="Observe">
<f:ajax execute="@form" />
</h:commandButton>
</h:form>
</sec:authorize>
</h:column>
</h:dataTable>
ページネーターのアクション:
<h:form style="margin: 0 0 0 0">
<h:commandButton styleClass="btn"
action="#{flightMBean.previous()}"
rendered="#{flightMBean.paginator.hasPreviousPage}"
value="Prev">
<f:ajax render=":toRender"/>
</h:commandButton>
<h:commandButton styleClass="btn" action="#{flightMBean.next()}"
rendered="#{flightMBean.paginator.hasNextPage}"
value="Next">
<f:ajax render=":toRender"/>
</h:commandButton>
datatable の最初のビュー ページでは、すべてが機能しているようです。[監視] をクリックすると、適切な ID を持つフライトがデータベースに移動します。「次へ」ボタンをクリックすると問題が発生します - データテーブルは新しい行でレンダリングされますが、すべての ID は最初のページと同じです。
たとえば、最初のページではフライトがあります: x から y の 20:00 に id=1 で、別のページは id=2 で、2 番目のページは id=3 の 3 番目のフライトでレンダリングされます。1回目や2回目の飛行を観察したい場合は大丈夫です!3 番目に観測したい場合は、id=1 のフライトがデータベースに移動します。
PS。form/commandButton/jsf コンポーネントなしで #{f.id} だけを配置すると、すべてがうまくいくように見えます... jsf コンポーネントだけでパラメータがリセットされます;/