我试图找到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>
Paginator行动:
<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的第一个视图页面,一切似乎都有效。当我点击&#39;观察&#39;有良好id的航班去数据库。点击&#39;下一步&#39; button - datatable呈现新行但每个id与第一页上的相同。
例如,在第一页上我有一个飞行:从20到00的x到y,id = 1 另一个id = 2,第二页渲染第三次飞行,id = 3。 如果我想观察第一次或第二次飞行,一切都还可以! 如果我想观察第三个,id = 1的航班将进入数据库。
PS。 如果我只使用#{f.id}而不使用form / commandButton / jsf组件,一切看起来都不错......只需jsf组件重置我的参数; /
答案 0 :(得分:0)
如果支持bean是请求范围的,并且在(后)构造期间不保留完全相同的数据模型(<h:dataTable value>
后面的对象),那么会发生这种情况。
将bean放在视图范围内,或者在bean的(post)构造函数中编写逻辑,以保留与将表格的表单呈现给最终用户时完全相同的数据模型。如果它取决于某些基于请求的条件,那么您可以使用<f:param>
在请求中保留它们。