在 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>
标签没有嵌套在 other中,<form>
但它在 other 中<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
部分<p:commandButton>
但我尝试了几种方法都没有成功。
注意:正在执行 bean 代码:
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;
}
}
用java代码没有问题,调试显示一切正常,但视图没有刷新后。
EDIT1:根据@stg 的回答,我尝试失败:
<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>
<h:form id="membership">
<h:panelGroup id="not_paid" layout="block" rendered="#{empty registerVisitBean.partner.activeMembership.payDate}">
<h:outputText value="#{registerVisitBean.paid ? registerVisitBean.partner.activeMembership.payDate : 'No pagada'}" styleClass="data-text red" />
<p:commandButton value="Pagar" actionListener="#{registerVisitBean.payMembership}" update="not_paid,@this" rendered="#{!registerVisitBean.paid}"/>
</h:panelGroup>
</h:form>
而不是预期的......这也不起作用。:'(
有任何想法吗?