繁体   English   中英

JSF PrimeFaces Ajax变量重置

[英]JSF PrimeFaces Ajax variable reset

我想在JSF-Page中进行倒数计时,并使用Primefaces中的<p:poll>解决了这一问题。

我有以下来源:

JSF页面:

<h:form>
    <h:outputText id="timeLeft" value="#{bean.secondsToGo}" />
    <p:poll interval="1" listener="#{bean.countdown}" stop="#{bean.secondsToGo<0}" update="timeLeft" />
</h:form>

BEAN(范围内):

private int secondsToGo;
public void setValues(){ //prerenderview-event )
    if(FacesContext.getCurrentInstance().isPostback()){
        System.out.println("POSTBACK RECOGNIZED");
        return; //ignore ajax-calls!
    }
    ...
    secondsToGo=74; //(the value depends from a GET-parameter
    System.out.println("INIT: " + secondsToGo);
}

public void countdown(){
    System.out.println("BEFORE: " + secondsToGo);
    secondsToGo--;
    System.out.println("AFTER: " + secondsToGo);
}

有趣或奇怪的是,当执行ajax调用(p:poll)时,secondsToGo重置为0:

INIT:74 //正确的值

之前:0

之后:-1

为什么?

您应该对某些MethodToSetTimeout_PrerenderView使用@PostConstruct批注,而不要使用prerenderview,因为“每个HTTP请求都会调用preRenderView事件(是的,这还包括ajax请求!”)。 如BalusC在何时使用prerenderview对比postpoststruct中所述

我还可以将轮询的停止条件更改为stop="#{bean.secondsToGo == 0}" ,这会使计数更加清晰。

编辑:

从我的角度来看,您要做的就是:

    <h:form>
        <h:outputText id="timeLeft" value="#{bean.secondsToGo}" />
        <p:poll interval="1" listener="#{bean.countdown}" stop="#{bean.secondsToGo == 0}" update="timeLeft" />
    </h:form>

private int secondsToGo;

@PostConstruct
public void init(){
    secondsToGo = 10;
}

public void countdown(){
    secondsToGo--;
}

但是,如果您还有其他期望,请纠正我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM