我需要向 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。它们共享所有共享的北部和西部部分并定义独特的中心
这就是为什么需要为该表使用三个 - 以便将更改推广到所有可能的视图(尽管只会及时选择一个)。我不认为(== 我仍然看不到)马格努斯认为一位听众会解决我的问题。如果您确定您的想法可行,请您进一步解释一下吗?