0

在 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>

而不是预期的......这也不起作用。:'(

有任何想法吗?

4

1 回答 1

0

你不能重新粉刷你从未建造过的墙!

这里:您不能更新以前没有渲染过的组件,因为它“只是不存在”!

您可以做的是将您的 panelgrid 嵌套在周围的 outputpanel 中并更新此 outputpanel 而不是网格:

<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>
于 2014-11-08T14:47:58.220 回答