【问题标题】:How can I correctly remove an AjaxSelfUpdatingTimerBehavior from a component in Apache Wicket?如何从 Apache Wicket 的组件中正确删除 AjaxSelfUpdatingTimerBehavior?
【发布时间】:2009-10-31 14:12:39
【问题描述】:

我在 Apache Wicket 中添加和删除 AjaxSelfUpdatingTimerBehavior 时遇到问题。该行为被添加好了,但是一旦我删除该行为,我很快就会在浏览器中出现“页面已过期”,我猜是因为删除不干净。我的设置基本上是一个按计时器开始更改的标签,以及两个链接:“go”和“stop”。我希望能够单击“开始”然后“停止”(显然我知道它永远不会反过来工作!)。这是我的完整标记:

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

非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: java ajax wicket


    【解决方案1】:

    我通过使用stop() 方法解决了这个问题,而不是尝试完全删除该行为。

    我实际上确实想在停止它后的某个时候完全删除它(因为我的解决方案涉及每次我点击“开始”时都会更新一个行为,我想继续停止并开始而不累积一百万个行为),所以我通过维护一个在以后的往返行程中要删除的行为列表来解决这个问题。

    【讨论】:

    • 我也使用 stop() 方法实现了它。我不知道(手动)删除行为是否真的有必要。如果停止,它将不再执行。一旦用户打开一个新页面,这些行为就会消失。
    【解决方案2】:

    如果能够在 AbstractAjaxTimerBehavior 上调用 restart() 或其他东西来重新启用计时器行为,那就太好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 2016-09-26
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多