0

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

命令按钮从数据表中删除记录。它工作正常,记录被删除,但是当对话框被隐藏时,数据表继续显示已删除的记录。我想以某种方式强制它刷新。有任何想法吗?我可以从我的支持 beanreviewManagerBean.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>
4

1 回答 1

0

你的数据表应该被正确地重新渲染,否则你会得到一个异常(类似于id 的组件:reviewManagerForm:protocolsDataTable could not be found)。

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

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

于 2013-10-23T16:59:22.987 回答