提问人:tulkas85 提问时间:9/2/2023 最后编辑:Jasper de Vriestulkas85 更新时间:9/5/2023 访问量:109
PrimeFaces 多个 DataTable 和 rowselect 事件
PrimeFaces multiple DataTables and rowselect event
问:
我有一个数据表的动态列表,我需要为每个表的单行启用行选择。 下面的代码仅在用户选择最后一个数据表的一行时才有效,这可能是因为 Ajax 事件被替换,并且只有最后一个事件有效。
如果用户从另一个数据表中选择一行,则调用 onRowSelect 方法,但有一个 on 变量。NullPointerException
selectedRow
也许我需要在 Java bean 中创建多个 onrowselect 方法,每个数据表一个,但这个表的数量是可变的。
如何解决此问题?
<c:forEach items="#{azPerformancePrenPubAll.selectedCompanyTemp}" var="companyCode" varStatus="loop">
<p:accordionPanel id="acc_#{companyCode}" widgetVar="accordionAziendale_#{companyCode}" activeIndex="-1">
<p:tab title="#{azPerformancePrenPubAll.selectedCompanyName.get(loop.index)}">
<p:dataTable id="tablePerformance_#{companyCode}" rendered="#{!azPerformancePrenPubAll.isCompanyVisible}"
widgetVar="tablePerformance" var="performance" value="#{azPerformancePrenotatiPubAll.listPerformances.get(loop.index)}"
styleClass="perfDataTable no-border" rowIndexVar="rowIndex"
selectionMode="single" selection="#{azPerformancePrenPubAll.selectedRow}" rowKey="#{performance.id}">
<p:ajax event="rowSelect" listener="#{azPerformancePrenPubAll.onRowSelect}" update="formPerformance,pageSubDescription,pageDescription"/>
...
答:
如果用户从数据表中选择一行而不是最后一行,则在循环中使用公共变量可能会导致selectedRow
NullPointerException
您可以尝试在后备 Bean 中创建一个 Map 来保存 for each .selectedRow
companyCode
private Map<String, YourDataType> selectedRows = new HashMap<>();
然后在您的 XHTML 中:
selection="#{azPerformancePrenPubAll.selectedRows[companyCode]}"
此外,还可以将或任何其他唯一标识符传递给侦听器中的方法。companyCode
<p:ajax event="rowSelect" listener="#{azPerformancePrenPubAll.onRowSelect(companyCode)}" />
在 Java Bean 中:
public void onRowSelect(String companyCode) {
// Logic here
}
在使用 时,请确保这对于每个循环迭代也是唯一的。widgetVar="tablePerformance"
使用独特的widgetVar有效,我仍然只使用变量selectedRow
如果您已经确认使用唯一变量可以解决问题,同时仍然使用单个变量,则可以按如下方式修改答案:widgetVar
selectedRow
您可以通过确保每个数据表组件都具有唯一的 .这将允许每个表在客户端独立运行,从而防止任何覆盖 .NullPointerException
widgetVar
selectedRow
widgetVar="tablePerformance_#{companyCode}"
通过使唯一变量,无论哪个表触发事件,都可以正确更新单个变量。widgetVar
selectedRow
rowSelect
这简化了您的后备 bean,因为不需要为每个方法维护一个映射或处理多个方法。它满足功能要求,是一个干净的解决方案。companyCode
onRowSelect
评论
RowSelected
id
widgetVar="tablePerformance"