我正在使用JSF2.2和Primefaces 6.1
开展项目我们遇到了Primefaces数据表过滤器的许多问题。他们中的大多数都是通过浏览互联网获得答案而得到纠正,但对于最后一个,我终于要求你的帮助了。
以下是上下文:
我们有一个代表模型实体详情页面的页面,我们称之为Person。 该实体可以链接到其他类型的其他几个模型实体,例如组织。
因此,在Person的详细信息页面中,我有一个数据表,显示其所有链接的组织,并启用了分页和过滤功能......
这是xhtml页面的修改但代表性的代码:
<h:form id="personForm">
<!-- Irrelevant Person attributes panel -->
<p:panel />
<!-- Organization links datatable panel -->
<p:panel toggleable="true" collapsed="true">
<p:datatable id="organizationsTable" var="organizationDto" value="#{personView.organizationDtos}" widgetVar="organizationsTableWidget" paginator="true" rows="10" first="personView.first" paginatorTemplate="Whatever...">
<!-- Table content -->
</p:datatable>
</p:panel>
</h:form>
现在,对于表的内容,第一列实际上是一个删除行的按钮,在列的标题中是一个“+”,用于将组织添加到列表中:
<p:column>
<f:facet name="header">
<p:column>
<p:commandButton icon="ui-icon-plus" action="#{personView.chooseOrganization()}" immediate="true" update="searchDialog" oncomplete="PF('organizationsTableWidget').paginator.setPage("PF('organizationsTableWidget').paginator.cfg.pageCount - 1);">
</p:commandButton>
</p:column>
</f:facet>
<p:commandButton icon="ui-icon-close" action="#{personView.removeOrganization"} >
</p:commandButton>
</p:column>
其他列是Organization实体的简单属性,标题中包含过滤器:
<p:column headerText="Organization ID" filterBy="#{organizationDto.id}" filterMatchMode="contains">
<h:outputText value="#{organizationDto.id}" />
</p:column>
现在,单击“+”按钮打开一个搜索对话框,允许用户搜索并选择要添加到Person数据表的组织:
private void onOrganizationChosen(OrganizationDto organizationDto) {
organizationsDto.add(organizationDto);
RequestContext.getCurrentInstance().update("personForm:organizationsTable");
}
最后,该页面包含一个Save按钮,该按钮可以持久修改,重新加载Person实体,并清除数据表的过滤器。
<p:commandButton value="Save" action="#{personView.save()}" update="personForm" oncomplete="PF('organizationsTableWidget').clearFilters()"
</p:commandButton>
现在问题: 在触发任何保存操作之前(因此尚未调用clearFilters()方法),添加组织会成功更新数据表(新组织在页面中立即可见)。 但是,如果用户执行保存操作(触发clearFilters()方法),则表中不显示任何添加的组织(更新未完成)但实体实际上在模型中:如果用户更改了过滤器数据表或重新保存(或者如果我从Firebug控制台调用表上的clearFilters()),则新组织出现......
我检查了AJAX响应,在非工作情况下,响应包含未修改版本的数据表。
我可能会提供更多细节,但由于这篇文章已经很长,而且我不确定什么是什么,哪些不相关,请随时询问其他信息。
感谢您提供的所有帮助。
编辑:我找到了解决方法
我注意到clearFilters()方法发出的AJAX请求将参数personForm%3AorganizationsTable_filtering设置为true,就好像正在使用实际的过滤器一样......并且通过浏览其他用户遇到的几个问题,似乎一次过滤正在桌面上使用它,它不能被AJAX使用,之后不再调用Widget filter()方法。
因此我编辑了方法:
private void onOrganizationChosen(OrganizationDto organizationDto) {
organizationsDto.add(organizationDto);
RequestContext.getCurrentInstance().update("personForm:organizationsTable");
RequestContext.getCurrentInstance().execute("PF('organizationsTableWidget').filter()");
}
现在,在添加新组织时,即使在clearFilters()调用(通过“保存”按钮)之后,也会执行该表的更新。
我发现这非常混乱,但它现在会做。 如果您有更好的解决方案,请告诉我。