我创建了一个通知托盘。首先,它的结构是使用
p:tabView
标签和两个选项卡进行编码的,每个选项卡内部都有一个 p:dataTable
。当我尝试更改其中一个 p:dataTable
的页面时,新页面未正确呈现,分页器消失。我认为问题在于 p:tabView
组件,我将 p:tabView
结构替换为嵌套 h:panelGroup
。问题在两个方面仍然存在。
这是页面的初始状态:
当我按下第2页时,
dataTable
呈现如下:
现在,如果我按下“Actualizar”按钮(更新按钮),现在第 2 页将正确呈现:
我不理解这种行为。这是之前使用
p:tabView
标签的代码:
<f:metadata>
<f:event type="preRenderView" listener="#{notificacionesBean.updateNotificacionesButton()}"/>
</f:metadata>
<p:scrollPanel id="localPanel" widgetVar="localPanel" mode="native" >
<div style="margin-left: 14px;">
<h3>
Notificaciones
</h3>
</div>
<p:tabView id="bandejas" activeIndex="#{notificacionesBean.activeTab}" dynamic="true" widgetVar="bandejasViewTab" >
<p:ajax event="tabChange" update="bandejas" listener="#{notificacionesBean.loadTab}" />
<p:tab title="Bandeja de Entrada (#{notificacionesBean.unread})" >
<f:facet name="title">
<i class="pi pi-inbox" />
<h:outputText value="Bandeja de Entrada (#{notificacionesBean.unread})" />
</f:facet>
<p:commandButton icon="pi pi-refresh" value="Actualizar" actionListener="#{notificacionesBean.updateNotificacionesButton()}" />
<p:commandButton actionListener="#{notificacionesBean.marcarComoLeidoMulti()}" update="bandejas globalForm:menItNotif" process="inbox @this" value="Marcar como leído(s)" icon="fa fa-regular fa-envelope-open" />
<p:commandButton actionListener="#{notificacionesBean.marcarComoNoLeidoMulti()}" update="bandejas globalForm:menItNotif" process="inbox @this" icon="pi pi-envelope" value="Marcar como no leído(s)" />
<p:commandButton actionListener="#{notificacionesBean.eliminarMulti()}" update="bandejas globalForm:menItNotif" process="inbox @this" icon="pi pi-trash" value="Eliminar" />
<br/>
<br/>
<p:dataTable id="inbox" rows="25" emptyMessage="Usted no tiene notificaciones nuevas" paginator="true" paginatorAlwaysVisible="false" var="msj" value="#{notificacionesBean.inboxMsjs}" selection="#{notificacionesBean.notifSeleccionadas}" rowKey="#{msj.idMsj}" widgetVar="inbox" rowIndexVar="indexMsj" selectionMode="multiple" >
<p:ajax event="rowSelect" listener="#{notificacionesBean.notificacionSeleccion}" />
<p:column selectionBox="true" style="text-align: center;" width="30" />
<p:column headerText="Remitente" style="width: 300px;">
<h:outputText value="#{notificacionesBean.abreviarCampo(msj.sender.nombre.replace('/', ' '), 37)}" style="font-weight: #{msj.fontWeight()}; display: block;" />
</p:column>
<p:column headerText="Asunto" >
<h:outputText value="#{notificacionesBean.abreviarCampo(msj.asuntoEstilizado(), 200)}" style="font-weight: #{msj.fontWeight()}; display: block;" />
</p:column>
<p:column headerText="Fecha" style="width: 55px;">
<center>
<h:outputText value="#{notificacionesBean.fechaEstilizada(msj)}" style="font-weight: #{msj.fontWeight()}; display: block;" />
</center>
</p:column>
<p:column style="width: 66px;">
<center>
<p:commandButton actionListener="#{notificacionesBean.eliminarUno(msj)}" update="globalForm:bandejas globalForm:menItNotif" icon="pi pi-trash" title="Eliminar" />
<p:commandButton actionListener="#{notificacionesBean.cambiarEstatusLeido(msj)}" update="globalForm:bandejas globalForm:menItNotif" icon="#{notificacionesBean.iconEnvelope(msj)}" title="#{notificacionesBean.titleEnvelope(msj)}" />
</center>
</p:column>
</p:dataTable>
</p:tab>
<p:tab title="Papelera">
<f:facet name="title">
<i class="pi pi-trash" />
<h:outputText value="Papelera" />
</f:facet>
<p:commandButton actionListener="#{notificacionesBean.moverAinbox()}" update="bandejas globalForm:menItNotif" process="trash @this" icon="pi pi-inbox" value="Mover a bandeja de entrada" />
<p:commandButton actionListener="#{notificacionesBean.marcarComoLeidoTrash()}" update="bandejas" process="trash @this" icon="fa fa-envelope-open" value="Marcar como leído(s)" />
<p:commandButton actionListener="#{notificacionesBean.marcarComoNoLeidoTrash()}" update="bandejas" process="trash @this" icon="pi pi-envelope" value="Marcar como no leído(s)" />
<br/>
<br/>
<p:dataTable id="trash" rows="25" emptyMessage="La bandeja esta vacía" paginator="true" paginatorAlwaysVisible="false" var="msj" value="#{notificacionesBean.trashBinMsjs}" selection="#{notificacionesBean.notifSeleccionadasTrash}" rowKey="#{msj.idMsj}" widgetVar="trash" rowIndexVar="trashMsj" selectionMode="multiple" >
<p:ajax event="rowSelect" listener="#{notificacionesBean.notificacionSeleccionTrash}" />
<p:column selectionBox="true" style="text-align: center;" width="30" />
<p:column headerText="Remitente" style="width: 300px;">
<h:outputText value="#{notificacionesBean.abreviarCampo(msj.sender.nombre, 37)}" style="font-weight: #{msj.fontWeight()}; display: block;" />
</p:column>
<p:column headerText="Asunto" >
<h:outputText value="#{notificacionesBean.abreviarCampo(msj.asuntoEstilizado(), 200)}" style="font-weight: #{msj.fontWeight()}; display: block;" />
</p:column>
<p:column headerText="Fecha" style="width: 55px;">
<center>
<h:outputText value="#{notificacionesBean.fechaEstilizada(msj)}" style="font-weight: #{msj.fontWeight()}; display: block;" />
</center>
</p:column>
<p:column style="width: 66px;">
<center>
<p:commandButton actionListener="#{notificacionesBean.moverAinboxMsj(msj)}" update="globalForm:bandejas globalForm:menItNotif" icon="pi pi-inbox" title="Mover a bandeja de entrada" />
<p:commandButton actionListener="#{notificacionesBean.cambiarEstatusLeido(msj)}" update="globalForm:bandejas globalForm:menItNotif" icon="#{notificacionesBean.iconEnvelope(msj)}" title="#{notificacionesBean.titleEnvelope(msj)}" />
</center>
</p:column>
</p:dataTable>
</p:tab>
</p:tabView>
</p:scrollPanel>
这是当前使用嵌套的代码
h:panelGroup
:
<f:metadata>
<f:event type="preRenderView" listener="#{notificacionesBean.updateNotificacionesButton()}"/>
</f:metadata>
<p:scrollPanel id="localPanel" widgetVar="localPanel" mode="native" >
<h3>
Notificaciones
</h3>
<h:panelGroup id="bandejas">
<table>
<tr>
<td>
<p:commandLink actionListener="#{notificacionesBean.setActiveTab(0)}" update="bandejas">
<div class="#{notificacionesBean.inboxClass()}">
<i class="pi pi-inbox" style="margin-right: 10px;" />Bandeja de Entrada (#{notificacionesBean.unread})
</div>
</p:commandLink>
</td>
<td>
<p:commandLink actionListener="#{notificacionesBean.setActiveTab(1)}" update="bandejas">
<div class="#{notificacionesBean.trashClass()}">
<i class="pi pi-trash" style="margin-right: 10px;" />Papelera
</div>
</p:commandLink>
</td>
</tr>
</table>
<br/>
<h:panelGroup rendered="#{notificacionesBean.activeTab == 0}">
<p:commandButton icon="pi pi-refresh" value="Actualizar" actionListener="#{notificacionesBean.updateNotificacionesButton()}" />
<p:commandButton actionListener="#{notificacionesBean.marcarComoLeidoMulti()}" update="bandejas globalForm:menItNotif" process="inbox @this" value="Marcar como leído(s)" icon="fa fa-regular fa-envelope-open" />
<p:commandButton actionListener="#{notificacionesBean.marcarComoNoLeidoMulti()}" update="bandejas globalForm:menItNotif" process="inbox @this" icon="pi pi-envelope" value="Marcar como no leído(s)" />
<p:commandButton actionListener="#{notificacionesBean.eliminarMulti()}" update="bandejas globalForm:menItNotif" process="inbox @this" icon="pi pi-trash" value="Eliminar" />
<br/>
<p:dataTable id="inbox" rows="25" emptyMessage="Usted no tiene notificaciones nuevas" paginator="true" paginatorAlwaysVisible="true" var="msj" value="#{notificacionesBean.inboxMsjs}" selection="#{notificacionesBean.notifSeleccionadas}" rowKey="#{msj.idMsj}" widgetVar="inbox" rowIndexVar="indexMsj" selectionMode="multiple" >
<p:ajax event="rowSelect" listener="#{notificacionesBean.notificacionSeleccion}" />
<p:column selectionBox="true" style="text-align: center;" width="30" />
<p:column headerText="Remitente" style="width: 300px;">
<h:outputText value="#{notificacionesBean.abreviarCampo(msj.sender.nombre.replace('/', ' '), 37)}" style="font-weight: #{msj.fontWeight()}; display: block;" />
</p:column>
<p:column headerText="Asunto" >
<h:outputText value="#{notificacionesBean.abreviarCampo(msj.asuntoEstilizado(), 200)}" style="font-weight: #{msj.fontWeight()}; display: block;" />
</p:column>
<p:column headerText="Fecha" style="width: 55px;">
<center>
<h:outputText value="#{notificacionesBean.fechaEstilizada(msj)}" style="font-weight: #{msj.fontWeight()}; display: block;" />
</center>
</p:column>
<p:column style="width: 66px;">
<center>
<p:commandButton actionListener="#{notificacionesBean.eliminarUno(msj)}" update="globalForm:bandejas globalForm:menItNotif" icon="pi pi-trash" title="Eliminar" />
<p:commandButton actionListener="#{notificacionesBean.cambiarEstatusLeido(msj)}" update="globalForm:bandejas globalForm:menItNotif" icon="#{notificacionesBean.iconEnvelope(msj)}" title="#{notificacionesBean.titleEnvelope(msj)}" />
</center>
</p:column>
</p:dataTable>
</h:panelGroup>
<h:panelGroup rendered="#{notificacionesBean.activeTab == 1}">
<p:commandButton actionListener="#{notificacionesBean.moverAinbox()}" update="bandejas globalForm:menItNotif" process="trash @this" icon="pi pi-inbox" value="Mover a bandeja de entrada" />
<p:commandButton actionListener="#{notificacionesBean.marcarComoLeidoTrash()}" update="bandejas" process="trash @this" icon="fa fa-envelope-open" value="Marcar como leído(s)" />
<p:commandButton actionListener="#{notificacionesBean.marcarComoNoLeidoTrash()}" update="bandejas" process="trash @this" icon="pi pi-envelope" value="Marcar como no leído(s)" />
<br/>
<br/>
<p:dataTable id="trash" rows="25" emptyMessage="La bandeja esta vacía" paginator="true" paginatorAlwaysVisible="true" var="msj" value="#{notificacionesBean.trashBinMsjs}" selection="#{notificacionesBean.notifSeleccionadasTrash}" rowKey="#{msj.idMsj}" widgetVar="trash" rowIndexVar="trashMsj" selectionMode="multiple" >
<p:ajax event="rowSelect" listener="#{notificacionesBean.notificacionSeleccionTrash}" />
<p:column selectionBox="true" style="text-align: center;" width="30" />
<p:column headerText="Remitente" style="width: 300px;">
<h:outputText value="#{notificacionesBean.abreviarCampo(msj.sender.nombre, 37)}" style="font-weight: #{msj.fontWeight()}; display: block;" />
</p:column>
<p:column headerText="Asunto" >
<h:outputText value="#{notificacionesBean.abreviarCampo(msj.asuntoEstilizado(), 200)}" style="font-weight: #{msj.fontWeight()}; display: block;" />
</p:column>
<p:column headerText="Fecha" style="width: 55px;">
<center>
<h:outputText value="#{notificacionesBean.fechaEstilizada(msj)}" style="font-weight: #{msj.fontWeight()}; display: block;" />
</center>
</p:column>
<p:column style="width: 66px;">
<center>
<p:commandButton actionListener="#{notificacionesBean.moverAinboxMsj(msj)}" update="globalForm:bandejas globalForm:menItNotif" icon="pi pi-inbox" title="Mover a bandeja de entrada" />
<p:commandButton actionListener="#{notificacionesBean.cambiarEstatusLeido(msj)}" update="globalForm:bandejas globalForm:menItNotif" icon="#{notificacionesBean.iconEnvelope(msj)}" title="#{notificacionesBean.titleEnvelope(msj)}" />
</center>
</p:column>
</p:dataTable>
</h:panelGroup>
</h:panelGroup>
</p:scrollPanel>
这是“Actualizar”按钮(更新按钮)的代码:
public void updateNotificacionesButton() {
inboxMsjs = mensajesService.findMensajesBandejaEntrada(usuario.getIdUsuario(), (short) 1);
unread = inboxMsjs.size();
PrimeFaces.current().ajax().update("globalForm:bandejas");
}
我在我的项目中使用这个:
如果有任何有关正在发生的事情的提示,我将不胜感激。谢谢。
问题是与以下
f:metadata
标签冲突:
<f:metadata>
<f:event type="preRenderView" listener="#{notificacionesBean.updateNotificacionesButton()}"/>
</f:metadata>
更改页面后,先前的侦听器被触发。此侦听器方法有另一个程序化的 ajax 更新,该更新与
p:dataTable
的内部 ajax 更新产生冲突。所以我调整了我的代码以便能够删除 f:metadata
标签。