我需要在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。它们共享所有共享的北部和西部部分并定义唯一的中心
这就是为什么需要为该表使用三个 - 为了改变所有可能的视图(尽管只会及时选择一个视图)。我不喜欢(==我仍然没有看到)马格努斯,一个听众会解决我的问题。如果你确定你的想法会有效,请你再解释一下吗?
答案 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");