0

我需要向 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" 的意义上启用)被初始化而没有其他人呢?

非常感谢。

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

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

4

2 回答 2

0

我认为您可以制作一个额外的 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");
于 2012-11-20T09:11:29.077 回答
0

我会选择只有一个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并且您的选择表保持原样。

于 2012-11-19T14:53:17.567 回答