PrimeFaces 多个数据表和行选择事件

问题描述 投票:0回答:1

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

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

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"/>
         ...
ajax jsf primefaces
1个回答
0
投票

如果用户从数据表中选择一行而不是最后一行,则在循环中使用公共

selectedRow
变量可能会导致
NullPointerException

您可以尝试在 backing bean 中创建一个 Map 来保存每个

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"
时,请确保这对于每个循环迭代也是唯一的。

© www.soinside.com 2019 - 2024. All rights reserved.