我相信没有直接的方法可以做到这一点。尽管使用两个 ajax 请求不太好,但您至少可以达到使用普通 PrimeFaces 时所期望的结果。如果您替换了p:ajax
与 PrimeFaces 扩展pe:javascript它不会与服务器进行往返
数据表呈现的每一行 (tr) 都有一个名为data-rk与您的 rowKey 和另一个名为data-ri与您的 rowIndexVar 值。
您可以获得data-rk属性通过dtWidgetVar.selection(dtWidgetVar 是数据表中 widgetVar 的名称)。
您现在可以使用remoteCommand将indexRow发送到您的模型
这是我用来测试它的代码:
The View
<p:remoteCommand name="displayIndex" process="@this" update="index" actionListener="#{viewMBean.displayRowIndex}"/>
<p:dataTable id="dt" var="data"
value="#{viewMBean.dataModel}"
selection="#{viewMBean.selectedRow}"
selectionMode="single"
widgetVar="dtVar"
rowIndexVar="index">
<p:ajax event="rowSelect"
oncomplete="displayIndex([{name:'index', value:jQuery('tr[data-rk=' + dtVar.selection + ']').attr('data-ri')}])" process="@this" />
<p:column headerText="#">
#{index + 1}
</p:column>
<p:column headerText="Dados">
#{data.name}
</p:column>
</p:dataTable>
<br />
Row Index: <p:inputText id="index" value="#{viewMBean.index}" />
托管Bean
public void displayRowIndex() {
FacesContext context = FacesContext.getCurrentInstance();
Map map = context.getExternalContext().getRequestParameterMap();
String pIndex = (String) map.get("index");
index = Integer.parseInt(pIndex);
}
如果您使用复选框选择,您可以像这样检索选定的索引:
function beforeDisplayingIndexes(){
var indexes = "";
jQuery("tbody .ui-chkbox-box").each(function(){
if (jQuery(this).hasClass("ui-state-active")){
indexes = indexes + (indexes === "" ? "" : ",") + jQuery(this).closest("tr").attr("data-ri");
}
});
//for debuging only
console.log(indexes);
displayIndex([{name:'index', value:indexes}])
}
您现在应该能够对代码进行适当的修改以利用它。