Ajax在jsf视图中不起作用

时间:2014-11-08 12:11:20

标签: java jsf primefaces primefaces-extensions

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

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

有什么想法吗?

1 个答案:

答案 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>