1

サブマーチャントをリストするデータテーブルがあります。また、サブマーチャントのサービスをリストする子データテーブルがあります。"p:rowExpansion" を使用して、サービスのデータ テーブルを表示します。ユーザーが親データテーブル行 (サブマーチャント) をダブルクリックしたときに、サブマーチャントの詳細を表示する必要があります。また、ユーザーがサービスのデータテーブル行をダブルクリックしたときにサービスの詳細を表示する必要があります。サブマーチャント テーブルに p:ajax event=rowDblselect を使用し、サービス テーブルに ajax event=rowSelect を使用すると、正常に動作します。しかし、やりたいことの両方のデータテーブルに ajax event=rowDblselect を使用すると失敗します。私のコードは次のようになります。

     <p:dataTable id="subMerchantsDataTable" var="subM"
             value="#{subMerchantManagement.subMerchantList}"
             rowKey="#{subM.subMerchantId}"
             selection="#{subMerchantCommon.selectedSubMerchant}"
             selectionMode="single"
             style="width:1000;border: 1px solid rgb(168, 168, 168);"
             scrollRows="20" scrollable="true" liveScroll="true"
             scrollHeight="450"
             emptyMessage="#{messagebundle.submerc_grdlabel_no_submerchant}">

           <p:ajax event="rowToggle"
              listener="#{subMerchantManagement.onRowToggle}" width="100%" />

           <p:ajax event="rowDblselect"
              listener="#{subMerchantManagement.retrieveSubmerchantDetails}"
              update=":mainTabView"  />

           <p:column width="20" disabledSelection="true">
              <p:rowToggler />
           </p:column>

           <p:column headerText="#{messagebundle.submerc_columnHeader_id}"
              width="70" sortBy="#{subM.subMerchantId}">
              <h:outputText value="#{subM.subMerchantId}" />
           </p:column>
           ...........
           ...........
           <p:rowExpansion>
              <p:dataTable id="subMerchantServicesDataTable" var="svc"
                 value="#{subM.subMerchantServices}" rowKey="#{svc.serviceId}"
                 selection="#{subMerchantCommon.selectedService}"
                 selectionMode="single"
                 style="border: 1px solid rgb(168, 168, 168);" 
                 emptyMessage="#{messagebundle.submerc_grdlabel_no_service}">

                 <p:ajax event="rowSelect"
                    listener="#{subMerchantManagement.retrieveSubmerchantDetailsByService}"
                    update=":mainTabView" />

                 <p:column width="18">
                    <h:outputText value="-" />
                 </p:column>
                 <p:column width="70">
                    <h:outputText value="#{svc.serviceId}" />
                 </p:column>
                    ...........
                    ...........
              </p:dataTable>
         </p:rowExpansion>
   </p:dataTable>

両方のデータテーブルに ajax event=rowDblselect を使用すると。サービスのデータテーブル行をダブルクリックすると、詳細ページが表示されますが、以下のようにコンソールからキャッチする例外が発生します。

`WARNING: Method not found: ........faces.bean.submerchants.SubMerchantManagement@1b0c025.retrieveSubmerchantDetailsByService(javax.faces.event.AjaxBehaviorEvent)
javax.el.MethodNotFoundException: Method not found: .........faces.bean.submerchants.SubMerchantManagement@1b0c025.retrieveSubmerchantDetailsByService(javax.faces.event.AjaxBehaviorEvent)
at com.sun.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:155)
at com.sun.el.parser.AstValue.invoke(AstValue.java:231)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
at org.primefaces.component.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:47)
at javax.faces.event.AjaxBehaviorEvent.processListener(AjaxBehaviorEvent.java:113)
at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:106)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:760)
at javax.faces.component.UIData.broadcast(UIData.java:1071)
at javax.faces.component.UIData.broadcast(UIData.java:1093)
at javax.faces.component.UIData.broadcast(UIData.java:1093)
at javax.faces.component.UIData.broadcast(UIData.java:1093)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)`

サブマーチャントのデータテーブル行をダブルクリックすると、詳細ページが表示されず (マネージド Bean メソッドを呼び出すことができません)、コンソールからキャッチしたのと同じ例外が発生します。サービスのデータテーブル行をダブルクリックすると、サブマーチャントのデータテーブルに関連するメソッドが呼び出され、同じ例外が再度スローされるようです。

解決策を考えている人はいますか?アドバイスをいただければ幸いです。入れ子になったデータテーブルが欲しいだけで、各データテーブルの行をクリックすると詳細に移動したい. 前もって感謝します....

4

2 に答える 2

1

一方のdataTableにrowDblselectを使用し、もう一方のdataTableにjQueryを介してdblClickイベントを手動でリッスンしてトリガーしてみてください

于 2012-12-17T12:30:53.883 に答える
0

簡単なテストを行ったところ、同じ結果が得られました。p:datatableに同じイベントがバインドされた別のネストがある場合、p:datatable重複したイベントは期待どおりに機能しません。

listenerまた、タグから属性を削除するp:ajaxと、基本的に「機能する」ことにも気付きました。

null別の問題は、選択した値が何らかの理由で値で上書きされることです。「回避策」は、選択値がnullでない場合、選択値のセッターをチェックインすることです。ただし、これらはすべて汚い回避策であり、バグを報告する必要があります;-)

作業例:

Bean (少なくともビュー スコープである必要があります):

public class Bean
{
    private List<String> firstList = new ArrayList<String>();
    private List<String> secondList = new ArrayList<String>();
    private String selection;

    @PostConstruct
    private void init()
    {
        firstList.add("First item");
        firstList.add("Second item");
        secondList.add("Third item");
        secondList.add("Fourth item");
    }

    public void setSelection(String selection)
    {
        if (selection != null && !selection.isEmpty())
        this.selection = selection;
    }

    // Other getters/setters omitted
}

JSF:

<h:form>
    <p:dataTable value="#{bean.firstList}" var="first" rowKey="#{first}"
        selection="#{bean.selection}" selectionMode="single">
        <p:ajax event="rowSelect" update=":selectionPanel" />
        <p:column>
            <p:rowToggler />
        </p:column>
        <p:column>
            <h:outputText value="#{first}" />
        </p:column>
        <p:rowExpansion>
            <p:dataTable value="#{bean.secondList}" var="second"
                rowKey="#{second}" selection="#{bean.selection}"
                selectionMode="single">
                <p:ajax event="rowSelect" update=":selectionPanel" />
                <p:column>
                    <h:outputText value="#{second}" />
                </p:column>
            </p:dataTable>
        </p:rowExpansion>
    </p:dataTable>
</h:form>
<p:panel id="selectionPanel" header="Selection">
    <h:outputText value="#{bean.selection}" />
</p:panel>
于 2012-12-17T17:13:38.097 に答える