2013-10-08 6 views
0

Я хочу обратный отсчет на моей странице JSF, и я решил его с помощью <p:poll> от Primefaces.JSF PrimeFaces Ajax variable reset

Я следующий источник:

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> 

БИН (вид области действия):

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: опрос), секундаToGo сбрасывается на 0:

INIT: 74 // правильное значение

ДО: 0

ПОСЛЕ: -1

Почему?

ответ

1

Вы должны использовать аннотацию @PostConstruct для someMethodToSetTimeout_PrerenderView вместо prerenderview как «Событие preRenderView вызывается в каждом HTTP-запросе (да, это также включает в себя запросы ajax!)». как BalusC заявляет в when-to-use-prerenderview-versus-postconstruct.

Я бы также изменил условие остановки для опроса на stop="#{bean.secondsToGo == 0}", он делает подсчет немного яснее.

EDIT:

С моей точки зрения, все, что вам нужно сделать, это:

<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--; 
} 

Но, пожалуйста, поправьте меня, если вы ожидаете, что-то еще ,

+0

Спасибо за ваш ответ, я забыл упомянуть, что я использую GET-параметр, и я отфильтровывать Ajax-запросы, когда PreRender вызывается: (. FacesContext.getCurrentInstance() IsPostBack()) если { System.out. println ("POSTBACK RECOGNIZED"); возвращение; // ignoreajax! } поэтому мне нужно установить переменные на prerenderview. Я понял, что если бы я поместил все используемые переменные в , это решило бы проблему, но это не может быть правильным. Может быть, есть еще один способ подсчета серверной переменной вниз (помимо опроса)? Все, что я хочу, это изменить только одну переменную, не все из bean ... – Niko

+0

вам нужно запустить счетчик несколько раз в одной странице? почему вы думаете, что нужно изменить несколько переменных? – Dodek

+0

Привет, Не хватает того, что в PostConstruct у меня нет доступа к моим параметрам viewparam (GET-Parameters). поэтому мне нужно установить значение init на первом prerenderview (его только один раз выполнил один раз) – Niko