PrimeFaces的DataTable即时行选择在浏览器中无法正确呈现

时间:2012-07-06 09:48:59

标签: java jsf primefaces

我有一个DataTable,我想做Instance Row Selection。单击一行后,将出现一个对话框,在PanelGrid中显示记录详细信息。我面临的问题是Dialog和PanelGrid没有呈现。当我从浏览器查看源代码时,它无法找到该元素。并且在Apache日志文件中,它有这个错误" javax.faces.FacesException:找不到具有标识符" frmMain:strMaint"的组件。在视野中。" frmMain是HTML表单的ID,strMaint是PanelGrid的ID。

以下是XHTML文件。

<?xml version='1.0' encoding='UTF-8' ?>
<!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:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>PROFIT V10</title>
        <h:outputStylesheet name="styles.css" library="css" />
    </h:head>
    <h:body>
        <h:form id="frmMain">
            <p:panel styleClass="layout-panel"
                     style="width: 98%; margin-left: auto; margin-right: auto; margin-top: 15px;">
                <h2>Store Search</h2>
                <p:focus context="pnlStoreSearchCriteria" />
                <h:panelGrid id="pnlStoreSearchCriteria" columns="2" styleClass="panel-search">
                    <h:outputText value="Company" />
                    <p:selectOneMenu id="coySub" value="#{storeSearchBean.coySub}" effect="">
                        <f:selectItems value="#{storeSearchBean.coysubmsts}" var="coysub"
                                        itemValue="#{coysub.coy_sub}"
                                        itemLabel="#{coysub.coy_sub} - #{coysub.coy_sub_name}" />
                    </p:selectOneMenu>
                    <h:outputText value="Business Unit" />
                    <p:selectOneMenu id="storeCat" value="#{storeSearchBean.storeCat}">
                        <f:selectItem itemLabel="" itemValue="" />
                        <f:selectItems value="#{storeSearchBean.strcatmsts}" var="strcatmst"
                                        itemValue="#{strcatmst.category}"
                                        itemLabel="#{strcatmst.category} - #{strcatmst.category_name}" />
                    </p:selectOneMenu>
                    <h:outputLabel for="store" value="Store" />
                    <p:autoComplete id="store" value="#{storeSearchBean.store}" maxResults="10" maxlength="4"
                                    completeMethod="#{storeSearchBean.populateStoreAutoComplete}" size="4" />
                    <h:outputLabel for="storeName" value="Store Name" />
                    <p:autoComplete id="storeName" maxlength="30" size="50"
                                    value="#{storeSearchBean.storeName}" maxResults="10"
                                    completeMethod="#{storeSearchBean.populateaStoreNameAutoComplete}" />
                    <f:facet name="footer">
                        <h:panelGroup id="pnlgrpButtonSearch">
                            <p:commandButton id="btnReset" type="reset" value="Reset"
                                                action="#{storeSearchBean.doReset}" />
                            <p:commandButton id="btnSearch" type="submit" value="Search"
                                                action="#{storeSearchBean.doSearch}"
                                                update="pnlStoreSearchResult" />
                        </h:panelGroup>
                    </f:facet>
                </h:panelGrid>
                <p:separator />
                <p:outputPanel id="pnlStoreSearchResult">
                    <p:dataTable id="tblStoreSearchResult" value="#{storeSearchBean.stores}" var="store"
                                    emptyMessage="No data to display" paginator="true" rows="10"
                                    paginatorPosition="bottom" draggableColumns="true" editable="true"
                                    selection="#{storeSearchBean.selectedStore}" selectionMode="single">
                        <!--
                        <p:ajax event="rowSelect" listener="#{storeSearchBean.onRowSelect}" update="frmMain:strMaint"
                                oncomplete="strmstDialog.show()" />
                        <p:ajax event="rowUnselect" listener="#{storeSearchBean.onRowUnselect}" />
                        -->
                        <p:column sortBy="#{store.store_coy_sub}" headerText="Company">
                            <h:outputText value="#{store.store_coy_sub}" />
                        </p:column>
                        <p:column sortBy="#{store.store_category}" headerText="Business Unit">
                            <h:outputText value="#{store.store_category}" />
                        </p:column>
                        <p:column sortBy="#{store.store}" headerText="Store">
                            <h:outputText value="#{store.store}" />
                        </p:column>
                        <p:column sortBy="#{store.store_name}" headerText="Store Name">
                            <p:cellEditor>
                                <f:facet name="output">
                                    <h:outputText value="#{store.store_name}" />
                                </f:facet>
                                <f:facet name="input">
                                    <h:inputText value="#{store.store_name}" />
                                </f:facet>
                            </p:cellEditor>
                        </p:column>
                        <p:column sortBy="#{store.store_type}" headerText="Type">
                            <p:cellEditor>
                                <f:facet name="output">
                                    <h:outputText value="#{store.store_type}" />
                                </f:facet>
                                <f:facet name="input">
                                    <h:selectOneMenu value="#{store.store_type}">
                                        <f:selectItem itemValue="W" itemLabel="W" />
                                        <f:selectItem itemValue="S" itemLabel="S" />
                                    </h:selectOneMenu>
                                </f:facet>
                            </p:cellEditor>
                        </p:column>
                        <p:column sortBy="#{store.store_del_cd}" headerText="Deleted">
                            <p:cellEditor>
                                <f:facet name="output">
                                    <h:outputText value="#{store.store_del_cd}" />
                                </f:facet>
                                <f:facet name="input">
                                    <h:selectOneMenu value="#{store.store_del_cd}">
                                        <f:selectItem itemValue="Y" itemLabel="Y" />
                                        <f:selectItem itemValue="N" itemLabel="N" />
                                    </h:selectOneMenu>
                                </f:facet>
                            </p:cellEditor>
                        </p:column>
                        <p:column>
                            <p:rowEditor />
                        </p:column>
                    </p:dataTable>
                    <p:dialog id="dlgMaint" header="Strmst Maintenance" widgetVar="strmstDialog" resizable="false"
                              modal="true" showEffect="fade" hideEffect="fade">
                        <h:panelGrid id="strMaint" columns="2">
                            <h:outputText value="#{storeSearchBean.selectedStore.store}" />
                            <h:outputText value="#{storeSearchBean.selectedStore.store_name}" />
                        </h:panelGrid>
                    </p:dialog>
                </p:outputPanel>
            </p:panel>
            <div id="copyright">Copyright &copy; 2012 QR Retail Automation (ASIA) Sdn. Bhd. All rights reservered.</div>
        </h:form>
    </h:body>
</html>

当我评论两个<p:ajax /> component时,Dialog和PanelGrid在浏览器中呈现为OK。

我的环境如下:

  • NetBeans 7.1.2
  • PrimeFaces 3.3.1(我也试过3.2但仍然相同
  • JDK 1.6.0.33
  • Apache Tomcat 7(也尝试使用Glassfish3,但仍然是相同的

感谢。

1 个答案:

答案 0 :(得分:2)

您需要使用绝对ID搜索组件。如果您看到findComponent的搜索算法:

确定将成为搜索基础的UIComponent,只要满足以下条件之一就停止:

  • 如果搜索表达式以分隔符开头(称为“绝对”搜索表达式),则base将是组件树的根UIComponent。将剥离前导分隔符,搜索表达式的其余部分将被视为“相对”搜索表达式,如下所述。

  • 否则,如果此UIComponent是NamingContainer,它将作为基础。

  • 否则,请搜索此组件的父级。如果遇到NamingContainer,它将成为基础。

  • 否则(如果没有遇到NamingContainer),根UIComponent将成为基础。

<p:commandButton>位于<p:dataTable>内,是一个UINamingContainer。所以你的搜索停在第二个子弹。

你可以通过在搜索表达式前面加上分隔符char来解决这个问题,从而从根目录搜索组件,如下所示:

update=":frmMain:strMaint"

Documentation