p:dataTable中有多个rowSelection侦听器

时间:2012-11-19 12:13:21

标签: java jsf primefaces

我需要在p:dataTable中为选择侦听器提供建议。我的观点是primefaces扩展布局 (pe:布局),北,左和中间部分。北部是桌子,左边是菜单。

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

所以我决定为每个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被选择(或者在禁用意义上启用=“#{leftMenuBacking.selection!=”ONE“ )得到初始化,没有其他人吗?

非常感谢。

编辑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。它们共享所有共享的北部和西部部分并定义唯一的中心

这就是为什么需要为该表使用三个 - 为了改变所有可能的视图(尽管只会及时选择一个视图)。我不喜欢(==我仍然没有看到)马格努斯,一个听众会解决我的问题。如果你确定你的想法会有效,请你再解释一下吗?

2 个答案:

答案 0 :(得分:0)

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

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

然后让支持bean决定在给定行的情况下应该做什么。有关如何获取辅助bean中所选行的示例,请查看PrimeFaces ShowCase。根据这些信息,支持bean肯定必须知道该怎么做。基本上,您可以在其中一个支持bean中调用适当的backing 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重新渲染(即更新),您的选择表将保持不变。

答案 1 :(得分:0)

我认为你可以制作一个额外的bean backingbean0。在那个bean中,你有一个监听器tableChangeListener。正如马格努斯所说,你有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");