Primefaces中的p:dialog无法从p:commandLink的onComplete中工作

3

之前,当我对其定义的widgetVar执行.show()操作时,我的p:dialog可以成功调用。但是最近在升级后,它停止工作了,并且我在浏览器中得到了以下错误:

网页错误细节:

User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MS-RTC LM 8)
Timestamp: Fri, 28 Mar 2014 04:04:49 UTC


Message: Object doesn't support this property or method
Line: 12
Char: 4302
Code: 0
URI: http://localhost:8282/OMNIVue/javax.faces.resource/primefaces.js.jsf?ln=primefaces


Message: Object doesn't support this property or method
Line: 16
Char: 1
Code: 0
URI: http://localhost:8282/OMNIVue/orders/orderSearch.jsf


Message: Could not complete the operation due to error 80020101.
Line: 81
Char: 17
Code: 0
URI: http://localhost:8282/OMNIVue/javax.faces.resource/jsf.js.jsf?ln=javax.faces&stage=Development


Message: 'confirmation' is undefined
Line: 83
Char: 1
Code: 0
URI: http://localhost:8282/OMNIVue/orders/orderSearch.jsf


Message: 'confirmation' is undefined
Line: 83
Char: 1
Code: 0
URI: http://localhost:8282/OMNIVue/orders/orderSearch.jsf

我有一个主页面,其中定义了我的“对话框”,内容如下。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:t="http://myfaces.apache.org/tomahawk"
    xmlns:mdw="http://www.qwest.com/mdw/jsf"
    xmlns:mwt="http://www.centurylink.com/mwt/jsf"
    xmlns:q="http://www.qwest.com/mdw/jsf"
    xmlns:p="http://primefaces.org/ui"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions">

<ui:composition>
 <script language="javascript" type="text/javascript">
    function solutionButtonClickHandler(){
        #{rich:component('addSolutionDlg')}.show(); 
        document.getElementById('addSolutionId').setAttribute('disabled', 'disabled');
    }

    function removeSearchParam(checkbox){
        var parentDiv = checkbox.parentNode;
        parentDiv.style.display = "none";
    }
    function displayErrorDialog(status){
        if(status == 'taskSelectedError'){
        #{rich:component('addSolutionTaskErrorDlg')}.show();
        }
    }
    function disableButtons(){
        if(document.getElementById('addSolution') != null)
            document.getElementById('addSolution').setAttribute('disabled', 'disabled');
        if(document.getElementById('escalateWorkItemTask') != null)
            document.getElementById('escalateWorkItemTask').setAttribute('disabled', 'disabled');
    }

    function removeEscalation(escalationId, taskInstanceId, taskId){
        if(document.getElementById('escalationid') != null)
            document.getElementById('escalationid').value = escalationId;
        if(document.getElementById('taskinstanceid') != null)
            document.getElementById('taskinstanceid').value = taskInstanceId;
        if(document.getElementById('taskid') != null)
            document.getElementById('taskid').value = taskId;
    }

    function redirectToActivityCenter(taskId){
        if(document.getElementById('taskid') != null)
            document.getElementById('taskid').value = taskId;
    }


  </script>
<rich:panel id="detailPanel" styleClass="floatL iconbdrNone bgcTransparent w790P "
            rendered="#{filterManager.orderFilter.showSearchPanel}">  
    <!-- <br style="background-color:white;" />      -->
  <h:form id="selectedParamForm" prependId="false"> 
   <h:inputHidden id="orderRefreshSubmit" forceId="true" value="false" />       
            <rich:collapsiblePanel styleClass="marLmin1 iconbdrNone W788P"  id="selectedSearchParams" 
                                   header="Selected Search Parameters" 
                                   switchType="client"
                                   expanded="#{orderSearchMenuBean.expandSearchParameters}" 
                                   rendered="#{filterManager.orderFilter.showSearchPanel}">
                <!-- <table style="margin-left: 10px; padding-top: 10px; padding-bottom: 25px;"> -->
                <table class="wrapperW100P" >
                    <ui:repeat var="searchParams" 
                               value="#{filterManager.orderFilter.selectedSearchParameters}" 
                               varStatus="serachParamsStatus">
                        <tr>
                            <ui:repeat var="searchParam" 
                                       value="#{searchParams}" 
                                       varStatus="status">
                                <td>
                                    <div style="margin-right:39px;">

                                        <h:selectBooleanCheckbox styleClass="floatL"
                                            value="#{filterManager.orderFilter.searchParamCheckbox}"
                                            label="#{searchParam.label}"  
                                            valueChangeListener="#{ordersListActionController.refreshOrders}" 
                                            onclick=" removeSearchParam(this); document.getElementById('orderRefreshSubmit').value='true'; ">
                                            <a4j:ajax event="change" execute="@this"  
                                                render="orderFilterPanel orderDetailPanel orderMessage " />

                                            <h:inputHidden value="#{searchParam.label}" />
                                        </h:selectBooleanCheckbox>

                                        <h:outputLabel value="#{searchParam.label}" styleClass="font floatL marT2"/>
                                        <!-- <br style="background-color:white;" /> -->
                                        <h:outputLabel value="#{searchParam.value}" styleClass="font floatL clearL marL20"/>
                                    </div>
                                </td>
                            </ui:repeat>
                        </tr>
                        <tr>
                            <td colspan="4">
                                <h:graphicImage value="../images/param_line.png"  styleClass="wrapperW100P height1P"/>
                            </td>
                        </tr>
                    </ui:repeat>
                </table>
            </rich:collapsiblePanel>

            <a4j:outputPanel ajaxRendered="true">
                <a4j:status onstart="#{rich:component('refreshOrders')}.show()"
                            onstop="#{rich:component('refreshOrders')}.hide()">
                </a4j:status>
           </a4j:outputPanel>

            <rich:popupPanel id="refreshOrders" autosized="true" domElementAttachment="parent">
                <h:panelGrid style="text-align:center !important;">

                    <h:graphicImage styleClass="floatL marL81" value="../images/loading.gif"/>
                    <h:outputText value="Please wait while the search refreshes" styleClass="font floatL clearL"></h:outputText>
                    <h:commandLink value="Cancel" onclick="#{rich:component('refreshOrders')}.hide()"
                    styleClass="green_addMoreLink floatL clearL marL81"/>
                </h:panelGrid>
            </rich:popupPanel>
    </h:form>
    <br style="background-color:white;" />
 <h:form id="ordSearchList" prependId="false">

                <mwt:expandableRowList id="ordersLst" listId="#{filterManager.orderFilter.dynamicListId}"
                listEntity="#{listManager.getMyOrders(filterManager.orderFilter.dynamicListId)}"
                label="Records"/>

            <p:dialog modal="true" widgetVar="confirmation" style="background:white !important;" closable="true" 
            header="Cancel Device Build Order" styleClass="stylePDialogHeader" width="500" id="confGirish" appendToBody="true">
                <h:panelGroup styleClass="wrapperW100P">
                    <h:outputText
                        value="Canceling device build order will cancel all new devices and Ethernet bearers associated to this request, and release all reserved ports. Do you wish to continue ? "
                        styleClass="font floatL" />
                    <h:panelGroup styleClass="floatR">
                    <a4j:commandButton value="Yes"
                        styleClass="cmdButton marL5 marR5 clearL"
                        action="#{orderListScopeActionCtrl.cancelDeviceBuildOrder}"
                        oncomplete="if(#{orderListScopeActionCtrl.displayPortAssignmentErrorDialog}){confirmation.hide();portassignment.show(); return false;}else if(#{orderListScopeActionCtrl.displayCancelSuccessDialog}){confirmation.hide();successDialog.show();return false;}else {confirmation.hide();errorCancelDialog.show();return false;}">
                    </a4j:commandButton>
                    <!-- Yes button onclick="if(#{orderListScopeActionCtrl.orderToCancelHasNIDDeviceStatus}){portassignment.show(); return false;}" -->
                    <h:commandButton value="No"
                        onclick="confirmation.hide();return false;"
                        styleClass="cmdButton marL5 clearL">
                    </h:commandButton>
                    </h:panelGroup>
                </h:panelGroup>             
            </p:dialog>

            <p:dialog header="Cancel Device Build Order" modal="true" widgetVar="successDialog" closable="true"
            style="background:white !important;" styleClass="stylePDialogHeader1" width="500">
                <h:panelGroup>
                    <h:outputText
                        value="Cancellation Process is initiated in DSP successfully."
                        styleClass="font floatL" />
<!--                <h:commandButton value="OK"
                        onclick="successDialog.hide();return false;"
                        styleClass="cmdButton floatR marL5 clearL">
                    </h:commandButton> -->
                    <!-- action="#{orderListScopeActionCtrl.refreshPageAfterUpdate}" -->
                    <a4j:commandButton value="OK"
                        styleClass="cmdButton floatR marL5 clearL"
                        action="#{orderListScopeActionCtrl.updateOrderStatusAndRefresh}"
                        oncomplete="successDialog.hide();return false;">
                    </a4j:commandButton>
                </h:panelGroup>
            </p:dialog>

            <p:dialog header="Confirm Cancel Device Build Order" modal="true" widgetVar="portassignment" closable="true"
            style="background:white !important;" styleClass="stylePDialogHeader1" width="500">
                <h:panelGroup>
                    <h:outputText
                        value="There are UNI/ENNIs assigned to ports on NID device. Please remove UNI/ENNIs and try again."
                        styleClass="font floatL" />
                    <h:commandButton value="OK"
                        onclick="portassignment.hide();return false;"
                        styleClass="cmdButton floatR marL5 clearL">
                    </h:commandButton>
                </h:panelGroup>
            </p:dialog>

            <p:dialog header="Cancel Device Build Order" modal="true" widgetVar="errorCancelDialog" closable="true"
            style="background:white !important;" styleClass="stylePDialogHeader1" width="500">
                <h:panelGroup>
                    <h:outputText
                        value="Some error occured during Cancellation Process in DSP. Please try later."
                        styleClass="font floatL" />
                    <h:commandButton value="OK"
                        onclick="errorCancelDialog.hide();return false;"
                        styleClass="cmdButton floatR marL5 clearL">
                    </h:commandButton>
                </h:panelGroup>
            </p:dialog>

            <ui:include src="escalationDlg.xhtml" />
            <ui:include src="addSolutionDlg.xhtml" />
            <h:inputHidden id="escalationid" value="#{ordersListActionController.escalationId}"></h:inputHidden>
            <h:inputHidden id="taskid" value="#{ordersListActionController.taskId}"></h:inputHidden>
            <h:inputHidden id="taskinstanceid" value="#{ordersListActionController.taskInstanceId}"></h:inputHidden>
    </h:form>
</rich:panel>
</ui:composition>   
</html>

我正在从一个组合组件XHTML中通过p:commandLink调用这些对话框,该组件如下:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:t="http://myfaces.apache.org/tomahawk"
    xmlns:p="http://primefaces.org/ui" 
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:mdw="http://www.qwest.com/mdw/jsf"
    xmlns:mwt="http://www.centurylink.com/mwt/jsf"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head></h:head>
<ui:composition>
        <script type="text/javascript" src="#{request.contextPath}/script/listSupport.js"/>

        <rich:panel styleClass="ordsearchDetail  iconbdrNone floatL " headerClass="headerBGWhite" >
        <f:facet name="header">
        <h:outputText value="Search Results" ></h:outputText>

        </f:facet>
        <div class="clearB"></div>
        <h:panelGroup styleClass="marT5">
                    <h:graphicImage value="../images/divider_line.png"></h:graphicImage></h:panelGroup>
                <h:panelGroup id="#{listId}_dataTablePanelGrid"
            rendered="#{rendered == null ? true : rendered}" columns="1"
            width="100%" cellpadding="0" cellspacing="0">

            <p:dataTable value="#{listEntity.items}" 
                id="#{listId}"
                var="listItem"
                rowIndexVar="rowIdxVar"
                style="#{webUtil.ie ? 'border-collapse:collapse;' : ''};"
                styleClass="mdw_ORD_upperLine bdrC3C3C3" 
                rows="#{listEntity.displayRows}" 
                cellspacing="0"
                width="750px"
                emptyMessage="Item(s) requested cannot be found" 
                lazy="true"
                first="#{listEntity.firstRow}" 
                paginator="true" 
                paginatorPosition="top"
                currentPageReportTemplate="#{label == null ? listEntity.name : label} ({startRecord} - {endRecord} of {totalRecords})"
                paginatorTemplate="{CurrentPageReport} {FirstPageLink}  {PreviousPageLink}  {NextPageLink}  {LastPageLink}">



                <p:columns value="#{listEntity.headerList}" var="colHeader"
                    columnIndexVar="colIdx" sortBy="#{listItem[colHeader.attribute]}" headerText="#{colHeader.label}" rendered="#{not empty listEntity.headerList}">
                    <f:facet name="header">

                        <h:selectBooleanCheckbox
                            rendered="#{listEntity.hasItems &amp;&amp; colHeader.checkbox &amp;&amp; colHeader.linkAction != 'removeWorkItemEscalation'}"
                            onclick="#{userRole == null?'':'selectAllOrders(this.form, this.checked);enableDisableAddWorkItem(this.form, this.checked);enableDisableAddSolution(this.form, this.checked);enableDisableEscalate(this.form, this.checked);'}"/>


                        <h:outputText id="#{listId}_header"
                            rendered="#{!colHeader.checkbox}" value="#{colHeader.label}"
                            immediate="true">
                        </h:outputText>

                    </f:facet>



                <p:commandLink actionListener="#{listEntity.performLinkAction(colHeader)}" 
                        rendered="#{colHeader.commandLink &amp;&amp; colHeader.linkAction != 'removeWorkItemEscalation' &amp;&amp; colHeader.linkAction == 'orderCancellation' &amp;&amp; listItem.cancelOrder}"
                        disabled="#{listItem.disabledOrder}" update="@form" process="@form" oncomplete="confirmation.show();"
                        title="Cancel Device Build Order" styleClass="#{listEntity.getStyleClass(colHeader)} mdw_listLinks">
                        <h:graphicImage value="#{colHeader.valueImage}" styleClass="marLR10 iconbdrNone"></h:graphicImage>
                        <f:setPropertyActionListener 
                        target="#{orderListScopeActionCtrl.orderToCancelHasNIDDeviceStatus}" value="#{listItem.cancelOrderNICDeviceStatus}"/>
                        <f:setPropertyActionListener 
                        target="#{orderListScopeActionCtrl.orderDeviceClli}" value="#{listItem.clliCode}"/>
                        <f:setPropertyActionListener 
                        target="#{orderListScopeActionCtrl.orderDeviceName}" value="#{listItem.deviceName}"/>   
                </p:commandLink>



        </rich:panel>
</ui:composition>
</html>
2个回答

7

尝试使用

oncomplete="PF('confirmation').show()"

-2
我使用以下方法解决了这个问题:
将我的 p:dialog 转换为 rich:popupPanel 并使用它来显示和隐藏弹出窗口:
{rich:component('addSolutionTaskErrorDlg')}.show() / .hide().

在调用 commandLink 时,使用这个错误就会从浏览器中消失。

我尝试使用 p:widgetVar('id').show() / .hide(),但是没有起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接