Primefaces数据表clearFilters()中断RequestContext update()

时间:2017-12-19 10:39:23

标签: javascript jsf primefaces

我正在使用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()调用(通过“保存”按钮)之后,也会执行该表的更新。

我发现这非常混乱,但它现在会做。 如果您有更好的解决方案,请告诉我。

0 个答案:

没有答案