1

我有一个列出 submerchants 的数据表。我还有一个子数据表,列出了 submerchants 的服务。我使用“p:rowExpansion”来显示服务数据表。当用户双击父数据表行(submerchant)时,我需要显示 submerchant 详细信息。此外,当用户双击服务数据表行时,我需要显示服务详细信息。如果我将 p:ajax event=rowDblselect 用于 submerchant 表,将 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)`

如果我双击 submerchants 数据表行,则无法显示详细信息页面(无法调用托管 bean 方法。)并且发生了我从控制台捕获的相同异常。看起来当我双击服务数据表行时,调用了与子商数据表相关的方法,并再次抛出了相同的异常。

有没有人有解决方案的想法?任何建议将被认真考虑。我只想嵌套数据表,并在单击每个数据表的行时导航到详细信息。提前致谢....

4

2 回答 2

1

尝试对其中一个数据表使用 rowDblselect,并通过 jQuery 手动侦听和触发另一个数据表的 dblClick 事件

于 2012-12-17T12:30:53.883 回答
0

我做了一个快速测试,结果我得到了相同的结果。当 ap:datatable有另一个p:datatable嵌套了相同的事件绑定到它时,它的重复事件将不会像您期望的那样工作。

我还注意到,如果您listener从标签中删除该属性,p:ajax它基本上是“有效的”。

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 回答