【问题标题】:Multiple rowSelection listeners in p:dataTablep:dataTable 中的多个 rowSelection 侦听器
【发布时间】:2012-11-19 12:13:20
【问题描述】:

我需要关于 p:dataTable 中的选择侦听器的建议。我的观点是 primefaces 扩展布局 (pe:layout),有北、左和中部分。北区是桌子,左边是菜单。

这个想法是左侧菜单为所选表格行中的数据提供不同的视图 因此,如果行更改,则需要刷新整个视图。 (取决于左侧菜单中选择的视图 - 这些由 bean backigOne、2 和 3 支持,并且当时只有一个处于活动状态)。

所以我决定为每个 bean 使用多个 rowSelect 事件:

 <p:dataTable id="" var="wo" value="#{TableBacking.dataList}"
    selection="#{TableBacking.selectedItem}" selectionMode="single" rowKey="#{wo}">

<p:ajax event="rowSelect" listener="#{backingOne.tableChangeListnener}" 
   update="..." disabled="#{leftMenuBacking.selection != "ONE" />
<p:ajax event="rowSelect" listener="#{backingTwo.tableChangeListnener}" 
   update="..." disabled="#{leftMenuBacking.selection != "TWO"/>
<p:ajax event="rowSelect" listener="#{backingThree.tableChangeListnener}" 
   update="..." disabled="#{leftMenuBacking.selection != "THREE" />

...

 </p:dataTable>

这很好用,因为总是在 leftMenuBacking 中选择一个项目,所以当时只会启用一个 ajax 事件。 但问题是,所有的 backingOne、backingTwo 和 backingThree bean 总是被初始化,因为声明:

  listener="#{backingXXX.tableChangeListnener}" 

在我的情况下,初始化成本很高:((时间方面)

我需要更好的设计提示,所以功能是相同的,但只有当前选择的菜单的支持 bean(或启用为 disabled="#{leftMenuBacking.selection != "ONE" ) 被初始化而没有其他的?

非常感谢。

EDIT 1 基于 Magnus Tengdahl 评论:

左侧菜单中的每个选项都有不同的页面。 backingOne.xhtml 页面如下所示:

   <ui:composition template="/publicResources/templates/gdfoxTemplate.xhtml">
<ui:define name="title">GDFox | Similar Problems</ui:define>

<!-- North contains the section with table that produces rowSelect event as described above -->
<ui:define name="north">
      <ui:include src="currentWorkload.xhtml" />
</ui:define>

<!-- Contains the left munu, uses p:menu widget-->
<ui:define name="west">
        <ui:include src="leftmenu.xhtml" />
</ui:define>

<!-- center view  based on BackingOne bean-->
<ui:define name="center">
     ....
    </ui:define>
  </ui:composition>

所以基本上,左侧菜单上的每个选择都在不同的 URL 上(我们就叫它们 backinOne/Two/Three.xhtml。它们共享所有共享的北部和西部部分并定义独特的中心

这就是为什么需要为该表使用三个 - 以便将更改传播到所有可能的视图(尽管会及时选择一个)。我不认为(== 我仍然看不到)马格努斯认为一位听众会解决我的问题。如果您确定您的想法可行,请您进一步解释一下吗?

【问题讨论】:

    标签: java jsf primefaces


    【解决方案1】:

    我会选择只有一个 rowSelect 听众,没有任何 disabled 条件:

    <p:ajax event="rowSelect" listener="#{backingOne.tableChangeListnener}" 
        update="menuArea" />
    

    然后让支持 bean 决定在给定选定行的情况下应该做什么。查看PrimeFaces ShowCase 以获取有关如何在支持bean 中获取选定行的示例。从这些信息中,backing bean 肯定知道该做什么。基本上,您可以在其中一个支持 bean 中调用适当的支持 bean 实现。

    你没有给我们任何左视图的代码,但我会推荐类似的东西(如果你还没有这样做的话):

    <h:panelGroup id="menuArea">
        <ui:fragment rendered="#{leftMenuBacking.selection == 'ONE'}">
            ... code for selection "ONE" ...
        </ui:fragment>
        <ui:fragment rendered="#{leftMenuBacking.selection == 'TWO'}">
            ... code for selection "TWO" ...
        </ui:fragment>
        <ui:fragment rendered="#{leftMenuBacking.selection == 'THREE'}">
            ... code for selection "THREE" ...
        </ui:fragment>
    </h:panelGroup>
    

    这样,您的左侧区域将为每个rowSelect 重新渲染(即更新),并且您的选择表保持原样。

    【讨论】:

      【解决方案2】:

      我认为你可以多做一个 bean backingbean0.在那个 bean 中你有监听器 tableChangeListener。正如 Magnus 所说,你有 1 个 p:ajax 在 tableChangeListener 中,您可以根据需要调用 backingbean1 2 或 3 。 (您的 backingbean0 中有此信息)

      protected Object getBean(String name) {
          FacesContext fcontext = FacesContext.getCurrentInstance();
          ELResolver resolver = fcontext.getApplication().getELResolver();
          Object bean = resolver.getValue(fcontext.getELContext(), null, name);
      
          if (bean == null) {
              getLog().warn("An object with name=" + name + " could not be resolved with ELResolver");
          }
      
          return bean;
      }
      

      你这样称呼它

      BackingBean1 bb1 = (BackingBean1) getBean("bb1");
      

      【讨论】:

        猜你喜欢
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 2011-07-16
        • 2013-09-24
        • 2011-08-21
        • 1970-01-01
        相关资源
        最近更新 更多