<p:autoComplete> 单元格内可编辑 <p:dataTable> 未调用完整方法
<p:autoComplete> inside cell editable <p:dataTable> not invoking complete method
我有一个具有单元格编辑和全局筛选功能的数据表:
<p:dataTable id="tbl01" value="#{userMappingBacking.staffList}" editable="true" editMode="cell" filteredValue="#{userMappingBacking.staffListFiltered}" var="s" rowKey="#{s.id}" widgetVar="tbl101WV">
...
<f:facet name="header">
<p:outputPanel>
<p:toolbar>
<p:toolbarGroup align="${text.line_start}">
<p:commandButton value="#{text.save}" action="#{userMappingBacking.saveChanges}" update="msgs"/>
</p:toolbarGroup>
<p:toolbarGroup align="${text.line_end}">
<h:outputText value="#{text.search_all_fields}:"/>
<p:spacer width="10"/>
<h:inputText id="globalFilter" onkeyup="PF('tbl101WV').filter()" />
</p:toolbarGroup>
</p:toolbar>
</p:outputPanel>
</f:facet>
...
<p:column headerText="#{text.user}" filterBy="#{s.userName}" filterable="false">
<p:cellEditor id="ceUser">
<f:facet name="output"><h:outputText value="#{s.userName}"/></f:facet>
<f:facet name="input">
<p:autoComplete id="acUser" dropdown="true" value="#{s.userName}" completeMethod="#{userMappingBacking.completeUnAssignedUser}"/>
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
并且支持 bean userMappingBacking
支持所有方法并且工作正常。
我的问题很奇怪,<p:autoComplete id="acUser"...
不会调用完整的方法,除非将过滤器应用于 table,在过滤器应用之后一切正常,但在此之前没有值在 p:autoComplete.
中完成
任何人都可以帮助或深入了解这一点。
我实际上发现问题出在支持 bean 中,我有 3 个列表:
staffList = new ArrayList<>();
staffListFiltered = new ArrayList<>();
userDTOList = new ArrayList<>();
那我填一个viewAction监听器
public void loadStaffListAction() {
staffList = zaties.listAllStaff();
staffListFiltered = zaties.listAllStaff();
userDTOList = iacw.listAllUsers();
}
问题是有 2 个不同的列表 staffList
和 staffListFiltered
填充了来自服务的不同对象,因此更改代码如下:
public void loadStaffListAction() {
staffList = zaties.listAllStaff();
staffListFiltered = staffList;
userDTOList = iacw.listAllUsers();
}
这解决了问题,但这不是最佳做法,如下所述。
常见错误:
在 filtered datatable 的 primefaces 展示中,从不将 filteredValue
列表初始化为任何东西,他们将其保留为 null
,以便数据表过滤器逻辑以正确的方式对其进行初始化,注意这个细节我建议:
除非出现错误,否则不要初始化任何东西。
欢迎评论!
我有一个具有单元格编辑和全局筛选功能的数据表:
<p:dataTable id="tbl01" value="#{userMappingBacking.staffList}" editable="true" editMode="cell" filteredValue="#{userMappingBacking.staffListFiltered}" var="s" rowKey="#{s.id}" widgetVar="tbl101WV">
...
<f:facet name="header">
<p:outputPanel>
<p:toolbar>
<p:toolbarGroup align="${text.line_start}">
<p:commandButton value="#{text.save}" action="#{userMappingBacking.saveChanges}" update="msgs"/>
</p:toolbarGroup>
<p:toolbarGroup align="${text.line_end}">
<h:outputText value="#{text.search_all_fields}:"/>
<p:spacer width="10"/>
<h:inputText id="globalFilter" onkeyup="PF('tbl101WV').filter()" />
</p:toolbarGroup>
</p:toolbar>
</p:outputPanel>
</f:facet>
...
<p:column headerText="#{text.user}" filterBy="#{s.userName}" filterable="false">
<p:cellEditor id="ceUser">
<f:facet name="output"><h:outputText value="#{s.userName}"/></f:facet>
<f:facet name="input">
<p:autoComplete id="acUser" dropdown="true" value="#{s.userName}" completeMethod="#{userMappingBacking.completeUnAssignedUser}"/>
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
并且支持 bean userMappingBacking
支持所有方法并且工作正常。
我的问题很奇怪,<p:autoComplete id="acUser"...
不会调用完整的方法,除非将过滤器应用于 table,在过滤器应用之后一切正常,但在此之前没有值在 p:autoComplete.
任何人都可以帮助或深入了解这一点。
我实际上发现问题出在支持 bean 中,我有 3 个列表:
staffList = new ArrayList<>();
staffListFiltered = new ArrayList<>();
userDTOList = new ArrayList<>();
那我填一个viewAction监听器
public void loadStaffListAction() {
staffList = zaties.listAllStaff();
staffListFiltered = zaties.listAllStaff();
userDTOList = iacw.listAllUsers();
}
问题是有 2 个不同的列表 staffList
和 staffListFiltered
填充了来自服务的不同对象,因此更改代码如下:
public void loadStaffListAction() {
staffList = zaties.listAllStaff();
staffListFiltered = staffList;
userDTOList = iacw.listAllUsers();
}
这解决了问题,但这不是最佳做法,如下所述。
常见错误:
在 filtered datatable 的 primefaces 展示中,从不将 filteredValue
列表初始化为任何东西,他们将其保留为 null
,以便数据表过滤器逻辑以正确的方式对其进行初始化,注意这个细节我建议:
除非出现错误,否则不要初始化任何东西。
欢迎评论!