使用Ajax更新Primefaces数据表摘要行

使用Ajax更新Primefaces数据表摘要行,ajax,jsf,primefaces,datatable,Ajax,Jsf,Primefaces,Datatable,提交表单(对话框)后,如何更新primefaces datatable摘要行 在执行一些CRUD操作后,datatable已正确更新,但摘要行未正确更新。在筛选数据表时,我使用p:remoteCommand更新摘要行,它工作正常 List.xhtml: <h:form id="TreinamentosListForm"> <p:panel header="#{treinaBundle.ListTreinamentosTitle}" > <p:remoteCo

提交表单(对话框)后,如何更新primefaces datatable摘要行

在执行一些CRUD操作后,datatable已正确更新,但摘要行未正确更新。在筛选数据表时,我使用p:remoteCommand更新摘要行,它工作正常

List.xhtml:

<h:form id="TreinamentosListForm">
<p:panel header="#{treinaBundle.ListTreinamentosTitle}" >
    <p:remoteCommand name="updateFooterSumCountId" update="datalist:footerSumCountId" />
    <p:dataTable id="datalist"
                filteredValue="#{treinamentosController.filteredTreinamentos}"
                value="#{treinamentosController.items}"
                var="item"
                rowKey="#{item.id}"
                paginator="true"
                selectionMode="single"
                selection="#{treinamentosController.selected}">
        <p:ajax event="filter" process="@form" update="@this" listener="#{treinamentosController.onFilter}" oncomplete="updateFooterSumCountId()" />
        <p:ajax event="rowSelect"   update=":TreinamentosListForm:createButton :TreinamentosListForm:viewButton :TreinamentosListForm:editButton :TreinamentosListForm:deleteButton :TreinamentosListForm:TreinamentosDataTableContextMenu" listener="#{treinamentosController.resetParents}"/>
        <p:ajax event="rowUnselect" update=":TreinamentosListForm:createButton :TreinamentosListForm:viewButton :TreinamentosListForm:editButton :TreinamentosListForm:deleteButton :TreinamentosListForm:TreinamentosDataTableContextMenu" listener="#{treinamentosController.resetParents}"/>
        <p:ajax event="rowDblselect" onsuccess="document.getElementById('TreinamentosListForm:viewButton').click();"/>

        <p:column sortBy="#{item.id}" filterBy="#{item.id}" style="text-align: right">
            <f:facet name="header">
                <h:outputText value="#{treinaBundle.ListTreinamentosTitle_id}"/>
            </f:facet>
            <h:outputText value="#{item.id}"/>
        </p:column>

        <p:columnGroup id="totalGroup"  rendered="true" type="footer" >
            <p:row>
                <p:column style="text-align:right">
                    <f:facet name="footer">
                        <!-- the summary row: -->
                        <h:outputText id="footerSumCountId" value="#{treinamentosController.sumCountId}" />
                    </f:facet>
                </p:column>
            </p:row>
        </p:columnGroup>        
    </p:dataTable>
    <f:facet name="header">
        <p:commandButton id="createButton" icon="ui-icon-plus"   value="#{treinaBundle.Create}" actionListener="#{treinamentosController.prepareCreate}" update=":TreinamentosCreateForm" oncomplete="PF('TreinamentosCreateDialog').show()"/>
        <p:commandButton id="viewButton"   icon="ui-icon-search" value="#{treinaBundle.View}" update=":TreinamentosViewForm" oncomplete="PF('TreinamentosViewDialog').show()" disabled="#{empty treinamentosController.selected}"/>
        <p:commandButton id="editButton"   icon="ui-icon-pencil" value="#{treinaBundle.Edit}" update=":TreinamentosEditForm" oncomplete="PF('TreinamentosEditDialog').show()" disabled="#{empty treinamentosController.selected}"/>
        <p:commandButton id="deleteButton" icon="ui-icon-trash"  value="#{treinaBundle.Delete}" actionListener="#{treinamentosController.delete}" update=":growl,datalist" disabled="#{empty treinamentosController.selected}">
        <p:confirm header="#{treinaBundle.ConfirmationHeader}" message="#{treinaBundle.ConfirmDeleteMessage}" icon="ui-icon-alert"/>
        </p:commandButton>
    </f:facet>
</p:panel>
<ui:include src="/WEB-INF/include/confirmation.xhtml"/>
</h:form>

Create.xhtml文件:

<p:dialog id="TreinamentosCreateDlg" widgetVar="TreinamentosCreateDialog" modal="true" resizable="false" appendTo="@(body)" header="#{treinaBundle.CreateTreinamentosTitle}" closeOnEscape="true" > 
    <h:form id="TreinamentosCreateForm">

        <h:panelGroup id="display" rendered="#{treinamentosController.selected != null}">
            <p:panelGrid columns="2" columnClasses="column">

                <p:outputLabel value="#{treinaBundle.CreateTreinamentosLabel_id}" for="id" />
                <p:outputLabel id="id" value="Value automatically generated from database." title="#{treinaBundle.CreateTreinamentosTitle_id}" />

            </p:panelGrid>
            <p:commandButton actionListener="#{treinamentosController.saveNew}" value="#{treinaBundle.Save}" update="@all,display,:TreinamentosListForm:datalist,:growl" oncomplete="handleSubmit(xhr,status,args,PF('TreinamentosCreateDialog'));">
                <p:confirm header="#{treinaBundle.ConfirmationHeader}" message="#{treinaBundle.ConfirmCreateMessage}" icon="ui-icon-alert"/>
            </p:commandButton>

            <p:commandButton value="#{treinaBundle.Cancel}" onclick="PF('TreinamentosCreateDialog').hide()"/>
        </h:panelGroup>
    </h:form>
</p:dialog>


提前感谢。

阅读Primefaces 5文档后,我所做的是调用(在Create.xhtml中)Primefaces筛选器方法,通过目标数据表(在List.xhtml中)中定义的widgetVar进行引用。执行此操作时,它会触发我的p:remoteCommand,该命令反过来会触发摘要行的更新:

<p:commandButton actionListener="#{treinamentosController.saveNew}" value="#{treinaBundle.Save}" update="@this,display,:TreinamentosListForm:datalist,:growl" oncomplete="handleSubmit(xhr,status,args,PF('TreinamentosCreateDialog'),PF('treinamentosTable').filter());" >
    <p:confirm header="#{treinaBundle.ConfirmationHeader}" message="#{treinaBundle.ConfirmCreateMessage}" icon="ui-icon-alert"/>
</p:commandButton>


如果有人有更优雅的解决方案,请分享。我没有时间

虽然我没有尝试汇总行,但数据表页脚也不会以这种方式更新。将摘要行内容封装在另一个容器组件中,然后更新该组件本身可能会有所帮助(不,我没有亲自尝试。因此,这不是一个里程碑。这可能只是一个机会)。Tiny,感谢您的提示,但这不起作用。幸运的是,我研究了Primefaces 5文档,并学会了如何简单地解决这个问题(见下面的答案)。无论如何谢谢你!!