在ajax调用提交按钮后更新primefaces或jsf视图

时间:2013-10-22 13:45:35

标签: jsf jsf-2 primefaces

我试图在ajax命令按钮请求之后更新一个primefaces表单(向导第一步)但没有成功。进行实际ajax调用的命令按钮位于对话框中。我希望在提交请求后强制我的视图刷新。

命令按钮从数据表中删除记录。它工作正常,记录被删除但是当对话框被隐藏时,数据表会一直显示已删除的记录。我想以某种方式强迫它刷新。有任何想法吗?我可以从我的支持bean reviewManagerBean.deleteProtocol()方法做到吗?

这是代码(我的BackBean是viewScoped):

<h:form id="reviewManagerForm">
...     
<pe:masterDetail id="masterDetail" level="#{reviewManagerBean.currentLevel}" showBreadcrumb="false" selectLevelListener="#{reviewManagerBean.levelListener}" >
    <f:facet name="header" >
        <h:panelGroup layout="block" style="margin-top: 10px;" >
            <h:panelGroup styleClass="levelTitle ui-state-default ui-corner-all wizard-breadcrumbs#{reviewManagerBean.currentLevel eq 1 ? 'ui-state-hover' : ''}">
                <h:outputText value="1: Protocol picker"/>
            </h:panelGroup>
            ...
            <p:messages id="mainMessagesPanel" showDetail="true" closable="true" />
        </h:panelGroup>         
    </f:facet>
    <pe:masterDetailLevel level="1">        
        <p:panel id="panel1" header="List of available protocols">                
            <p:dataTable id="protocolsDataTable" var="cRProtocol" rowKey="#{cRProtocol.revProtId}" value="#{reviewManagerBean.cRReviewProtocolList}"
                widgetVar="protocolsTable" 
                ...
                selection="#{reviewManagerBean.selectedReviewProtocol}" 
                selectionMode="single" >
                ...
                <p:ajax event="rowSelect" listener="#{reviewManagerBean.setSelectedRow}" />
                <p:ajax event="rowUnselect" listener="#{reviewManagerBean.unsetSelectedRow}"/>
                ...
                <p:column sortBy="#{cRProtocol.revProtTitle}" headerText="Title" style="width:200px;text-align:center;">
                    <h:outputText value="#{cRProtocol.revProtTitle}" />
                </p:column>
                ...
                <p:column>
                    <p:commandButton value="Delete" onclick="dlg5.show()"
                        update=":reviewManagerForm:deleteSingleProtocol"
                        disabled="#{reviewManagerBean.checkifProtocolIsOpen(cRProtocol)}"
                        ajax="true" process=":reviewManagerForm:deleteSingleProtocol" />                 
                </p:column>         
            </p:dataTable>                
        </p:panel>
    ...
    <p:dialog id="dialog-deleteprotocol" header="Delete Image Type" widgetVar="dlg5" dynamic="true"  modal="true" resizable="false">                
        <p:panelGrid id="deleteSingleProtocol">
        <p:row>
            <p:column>  
                <h:outputText value="Id:" style="font-weight:bold; padding-right:10px" />
            </p:column>
            <p:column>
                <h:outputText value="#{reviewManagerBean.selectedReviewProtocol.revProtId}" />  
            </p:column>
        </p:row>
        ...
            <p:column>
                <p:commandButton id='protocolDelete' 
                    value='Delete'
                    action='#{reviewManagerBean.deleteProtocol()}'                                                          
                    ajax="true"
                    onclick="dlg5.hide()" icon="ui-icon-disk" 
                    update=":reviewManagerForm:protocolsDataTable"
                    process=":reviewManagerForm:deleteSingleProtocol" />  
            </p:column>
        </p:row>
    </p:panelGrid>              
</p:dialog>

1 个答案:

答案 0 :(得分:0)

你的数据表应该正确地重新渲染,否则你会得到一个例外(类似于组件的id:reviewManagerForm:无法找到protocolsDataTable )。

这意味着#{reviewManagerBean.cRReviewProtocolList}将再次被调用。您需要从该列表中删除该项目。这是从#{reviewManagerBean.deleteProtocol}

适当完成的

删除后调用#{reviewManagerBean.cRReviewProtocolList}时,数据表将更新。