2009-10-31 12 views
7

Ho problemi con l'aggiunta e la rimozione di un AjaxSelfUpdatingTimerBehavior in Apache Wicket. Il comportamento viene aggiunto ok, ma non appena rimuovo il comportamento ottengo una "Pagina scaduta" visualizzata nel browser molto presto, suppongo perché la rimozione non è stata pulita. Il mio set up è fondamentalmente un'etichetta che inizia a cambiare con il timer e due link: "go" e "stop". Voglio poter fare clic su "go" e quindi su "stop" (ovviamente so che non funzionerà mai nel contrario!). Ecco la mia marcatura completa:Come posso rimuovere un AjaxSelfUpdatingTimerBehavior da un componente in Apache Wicket?

<html>  
    <body>    
     <span wicket:id="message">message will be here</span><br/> 
     <a wicket:id="go">Go</a><br/>   
     <a wicket:id="stop">Stop</a>   
    </body> 
</html> 

e il mio codice qui:

// imports all from standard wicket 
public class HomePage extends WebPage { 

    private static final int INTERVAL = 500; 

    public HomePage(final PageParameters parameters) { 

     final Component label = new Label("message", 
      "Hello").setOutputMarkupId(true); 

     add(label); 

     final IBehavior updater = new AjaxSelfUpdatingTimerBehavior(Duration 
      .milliseconds(INTERVAL)) { 
      @Override 
      protected void onPostProcessTarget(AjaxRequestTarget target) {      
       label.setDefaultModelObject(String.valueOf(System.nanoTime()));    
      } 
     }; 

     AjaxLink<String> go = new AjaxLink<String>("go") { 
      @Override 
      public void onClick(AjaxRequestTarget target) { 
       label.add(updater);        
       target.addComponent(label); 
      }   
     }; 

     AjaxLink<String> stop = new AjaxLink<String>("stop") { 
      @Override 
      public void onClick(AjaxRequestTarget target) { 
       label.remove(updater); 
       target.addComponent(label); 
      }   
     }; 

     add(go, stop); 
    } 
} 

sto usando Wicket 1.4.3.

Qualsiasi aiuto molto apprezzato. Grazie.

risposta

3

Ho risolto questo problema utilizzando il metodo stop() invece di tentare di rimuovere completamente il comportamento.

Io in realtà fanno vogliono eliminarlo del tutto ad un certo punto dopo l'arresto (perché la mia soluzione comporta Newing un comportamento up ogni volta mi ha colpito "go" e voglio continuare a arrestare e avviare senza accumulare un milione di comportamenti) quindi l'ho risolto mantenendo un elenco di comportamenti da rimuovere in alcuni round successivi.

+0

L'ho implementato anche utilizzando il metodo stop(). Non so se (manualmente) rimuovere il comportamento sia davvero necessario. Se viene fermato, non verrà più eseguito. E una volta che gli utenti aprono una nuova pagina, i comportamenti sono comunque spariti. – Friederike

0

Sarebbe stato bello poter chiamare restart() o qualcosa in AbstractAjaxTimerBehavior per riattivare il comportamento del timer.

Problemi correlati