在JSF Primefaces / PrimefacesExtension应用程序中,我有一些ajax错误行为。
视图的一部分仅在条件为真时显示:
<h:form id="membership" rendered="#{empty registerVisitBean.partner.activeMembership.payDate}">
在里面,有2个网格:第一个带有红色文字和一个用于执行操作的按钮(支付会员资格),第一个网格将在完成操作时消失,第二个网格将显示:
<p:panelGrid id="not_paid" layout="grid" columns="2" rendered="#{!registerVisitBean.paid}">
<h:outputText value="No pagada" styleClass="data-text red" />
<p:commandButton value="Pagar" actionListener="#{registerVisitBean.payMembership}" update="paid,not_paid" />
</p:panelGrid>
<p:panelGrid id="paid" layout="grid" columns="1" rendered="#{registerVisitBean.paid}">
<h:outputText value="#{registerVisitBean.partner.activeMembership.payDate}" styleClass="data-text" />
</p:panelGrid>
视图很长,但是其他部分有独立的形式,在这里并不重要...... <form>
标记没有嵌套在其他<form>
内,但它在其他<p:panelGrid>
中,但不是我认为的问题,这是在相同的视图中发生的,以便在做出动作并完美地改变元素的颜色后:
<h:form id="notes">
<p:panelGrid id="partner_notes" layout="grid" columns="1" >
<p:inputTextarea value="#{registerVisitBean.partnerNotes}" id="notes" rows="2" autoResize="false" styleClass="#{registerVisitBean.saved ? 'full-width unresizable success' : 'full-width unresizable'}" style="padding: 0"></p:inputTextarea>
<p:commandButton value="Guardar Notes" actionListener="#{registerVisitBean.updateNotes}" styleClass="full-width" update=":notes:partner_notes"/>
</p:panelGrid>
</h:form>
我认为问题出现在update
的{{1}}部分,但我已经尝试了几种方法而没有成功。
注意:正在执行bean代码:
<p:commandButton>
使用java代码没有问题,调试显示一切正常,但视图未刷新后。
EDIT1:根据@stg的回答,我尝试了不成功:
private boolean paid;
// ( getter / setter)
public void payMembership(){
MembershipDto membership = partner.getActiveMembership();
membership.setPayDate(new Date());
membership.setMember(partner);
membership = partnerManagementFacade.updateMembership(membership);
if (membership != null){
System.err.println("Paid > " + membership.getPayDate());
paid = true;
}
}
正如他的回答所说:
您无法更新之前未呈现过的组件,因为它“只是不存在”!
我认为使用他的代码,问题会持续存在(第二次面板网格没有第一次呈现,所以我无法更新它,因为它不存在。
为了避免此问题,我决定更新<p:outputPanel id="container">
<p:panelGrid id="not_paid" layout="grid" columns="2" rendered="#{!registerVisitBean.paid}">
<h:outputText value="No pagada" styleClass="data-text red" />
<p:commandButton value="Pagar" actionListener="#{registerVisitBean.payMembership}" update="container" />
</p:panelGrid>
<p:panelGrid id="paid" layout="grid" columns="1" rendered="#{registerVisitBean.paid}">
<h:outputText value="#{registerVisitBean.partner.activeMembership.payDate}" styleClass="data-text" />
</p:panelGrid>
并从视图中删除<p:outputText>
:
<p:commandButton>
而不是预期......这也不起作用。 :'(
有什么想法吗?
答案 0 :(得分:0)
你无法重画你从未建造过的墙!
此处:您无法更新之前未呈现过的组件,因为它“只是没有”!
您可以做的是将panelgrid嵌套在周围的输出面板中,并更新此输出面板而不是网格:
<p:outputPanel id="container">
<p:panelGrid id="not_paid" layout="grid" columns="2" rendered="#{!registerVisitBean.paid}">
<h:outputText value="No pagada" styleClass="data-text red" />
<p:commandButton value="Pagar" actionListener="#{registerVisitBean.payMembership}" update="container" />
</p:panelGrid>
<p:panelGrid id="paid" layout="grid" columns="1" rendered="#{registerVisitBean.paid}">
<h:outputText value="#{registerVisitBean.partner.activeMembership.payDate}" styleClass="data-text" />
</p:panelGrid>
</p:outputPanel>