0

我想在我的 JSF 页面中进行倒计时,我用<p:poll>Primefaces 解决了它。

我有以下来源:

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-call (p:poll) 时, secondsToGo 被重置为 0:

INIT: 74 //正确的值

之前:0

之后:-1

为什么?

4

1 回答 1

1

您应该为 someMethodToSetTimeout_PrerenderView 使用 @PostConstruct 注释而不是 prerenderview,因为“每个 HTTP 请求都会调用 preRenderView 事件(是的,这也包括 ajax 请求!)。” 正如 BalusC 在when-to-use-prerenderview-versus-postconstruct中所述。

我还会将 poll 的停止条件更改为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--;
}

但请纠正我,如果你期待更多。

于 2013-10-08T08:45:59.290 回答