[英]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.