0

インスタンス行の選択を行いたい DataTable があります。行をクリックすると、ダイアログが表示され、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>

この 2 つ<p:ajax /> componentに注目すると、Dialog と PanelGrid がブラウザーで正常にレンダリングされます。

私の環境は以下の通りです。

  • NetBeans 7.1.2
  • PrimeFaces 3.3.1 ( 3.2 でも試しましたが、同じです)
  • JDK1.6.0.33
  • Apache Tomcat 7 ( Glassfish3 でも試しましたが、同じです)

ありがとう。

4

1 に答える 1

2

絶対 ID を使用してコンポーネントを検索する必要があります。findComponent の検索アルゴリズムが表示される場合:

次のいずれかの条件が満たされるとすぐに停止して、検索のベースとなる UIComponent を特定します。

  • 検索式が区切り文字で始まる場合 (「絶対」検索式と呼ばれます)、ベースはコンポーネント ツリーのルート UIComponent になります。先頭の区切り文字は取り除かれ、検索式の残りの部分は、以下で説明する「相対」検索式として扱われます。

  • それ以外の場合、この UIComponent が NamingContainer の場合、それがベースとして機能します。

  • それ以外の場合は、このコンポーネントの親を検索します。NamingContainer が検出された場合、それがベースになります。

  • それ以外の場合 (NamingContainer が検出されない場合) は、ルート UIComponent がベースになります。

<p:commandButton>内部にはUINamingContainer<p:dataTable>があります。したがって、検索は 2 番目の箇条書きで停止します。

これを解決するには、検索式の前に区切り文字 char を追加して、次のようにルートからコンポーネントを検索します。

update=":frmMain:strMaint"

ドキュメンテーション

于 2012-07-06T15:52:52.317 に答える