PrimeFaces 多个 DataTable 和 rowselect 事件

PrimeFaces multiple DataTables and rowselect event

提问人:tulkas85 提问时间:9/2/2023 最后编辑:Jasper de Vriestulkas85 更新时间:9/5/2023 访问量:109

问:

我有一个数据表的动态列表,我需要为每个表的单行启用行选择。 下面的代码仅在用户选择最后一个数据表的一行时才有效,这可能是因为 Ajax 事件被替换,并且只有最后一个事件有效。

如果用户从另一个数据表中选择一行,则调用 onRowSelect 方法,但有一个 on 变量。NullPointerExceptionselectedRow

也许我需要在 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"/>
         ...
Ajax JSF Primefaces

评论

0赞 Jasper de Vries 9/2/2023
我没有看到变量RowSelected
0赞 tulkas85 9/2/2023
@JasperdeVries抱歉,我拼错了变量名称,我编辑了帖子。 该变量在 DataTable 的 Selection 属性中指定,它是 'selectedRow'
0赞 Melloware 9/4/2023
您正在使用多个表并重命名了该字段,但所有表都有一个相同的 widgetVar,这是不允许的。每个小部件的 WidgetVar 必须是唯一的。idwidgetVar="tablePerformance"

答:

4赞 VonC 9/4/2023 #1

如果用户从数据表中选择一行而不是最后一行,则在循环中使用公共变量可能会导致selectedRowNullPointerException

您可以尝试在后备 Bean 中创建一个 Map 来保存 for each .selectedRowcompanyCode

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

如果您已经确认使用唯一变量可以解决问题,同时仍然使用单个变量,则可以按如下方式修改答案:widgetVarselectedRow

您可以通过确保每个数据表组件都具有唯一的 .这将允许每个表在客户端独立运行,从而防止任何覆盖 .NullPointerExceptionwidgetVarselectedRow

widgetVar="tablePerformance_#{companyCode}"

通过使唯一变量,无论哪个表触发事件,都可以正确更新单个变量。widgetVarselectedRowrowSelect

这简化了您的后备 bean,因为不需要为每个方法维护一个映射或处理多个方法。它满足功能要求,是一个干净的解决方案。companyCodeonRowSelect

评论

1赞 tulkas85 9/5/2023
谢谢,使用独特的widgetVar有效,我仍然只使用变量selectedRow
0赞 VonC 9/5/2023
@tulkas85好的。我已经编辑了答案以解决您的评论。