2009-10-31 57 views
7

我在添加並刪除Apache Wicket中的AjaxSelfUpdatingTimerBehavior時遇到了問題。該行爲得到了補充,但後來一旦我刪除了行爲,我很快就會在瀏覽器中看到「Page Expired」,我猜是因爲刪除不乾淨。我的設置基本上是一個由計時器開始改變的標籤,以及兩個鏈接:「去」和「停止」。我希望能夠點擊「去」然後「停止」(顯然我知道它永遠不會反過來工作!)。這裏是我完整的標記:如何從Apache Wicket中的組件正確刪除AjaxSelfUpdatingTimerBehavior?

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

,這裏是我的代碼:

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

我使用的Wicket 1.4.3。

任何幫助非常感謝。謝謝。

回答

3

我通過使用stop()方法解決了這個問題,而不是試圖完全刪除行爲。

我其實希望在某個時候停止它之後完全刪除(因爲我的解決方案涉及newing行爲了,每次我打「走出去」,我想繼續停止,但不會累積百萬行爲開始)所以我通過在稍後的往返中保留一個要刪除的行爲列表來解決這個問題。

+0

我也使用stop()方法實現了它。我不知道是否(手動)刪除行爲是非常必要的。如果停止,它將不會再執行。一旦用戶打開一個新頁面,行爲無論如何都會消失。 – Friederike 2014-10-23 11:59:03

0

如果能夠調用restart()或AbstractAjaxTimerBehavior上的某個函數來重新啓用計時器行爲,那本來就不錯。