Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从Apache Wicket中的组件中正确删除AjaxSelfUpdatengTimerBehavior?_Java_Ajax_Wicket - Fatal编程技术网

Java 如何从Apache Wicket中的组件中正确删除AjaxSelfUpdatengTimerBehavior?

Java 如何从Apache Wicket中的组件中正确删除AjaxSelfUpdatengTimerBehavior?,java,ajax,wicket,Java,Ajax,Wicket,我在ApacheWicket中添加和删除AjaxSelfUpdatengTimerBehavior时遇到问题。行为被添加好了,但是一旦我删除了行为,我很快就会在浏览器中出现一个“页面过期”,我猜是因为删除不干净。我的设置基本上是一个标签,通过计时器开始改变,还有两个链接:“开始”和“停止”。我希望能够单击“go”然后单击“stop”(显然,我知道它永远不会反过来工作!)。以下是我的完整标记: <html> <body>

我在ApacheWicket中添加和删除AjaxSelfUpdatengTimerBehavior时遇到问题。行为被添加好了,但是一旦我删除了行为,我很快就会在浏览器中出现一个“页面过期”,我猜是因为删除不干净。我的设置基本上是一个标签,通过计时器开始改变,还有两个链接:“开始”和“停止”。我希望能够单击“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导入所有
公共课主页扩展网页{
专用静态最终整数间隔=500;
公共主页(最终页面参数){
最终组件标签=新标签(“消息”,
“Hello”).setOutputMarkupId(true);
添加(标签);
最终IBehavior更新程序=新的AjaxSelfUpdatengTimerbehavior(持续时间
.毫秒(间隔)){
@凌驾
PostProcessTarget(AjaxRequestTarget目标)上受保护的无效项{
label.setDefaultModelObject(String.valueOf(System.nanoTime());
}
};
AjaxLink go=新的AjaxLink(“go”){
@凌驾
公共void onClick(AjaxRequestTarget目标){
label.add(更新程序);
target.addComponent(标签);
}           
};
AjaxLink停止=新的AjaxLink(“停止”){
@凌驾
公共void onClick(AjaxRequestTarget目标){
label.remove(更新程序);
target.addComponent(标签);
}           
};
加(去,停);
}
}
我用的是Wicket 1.4.3


非常感谢您的帮助。谢谢。

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


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

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

我还使用stop()方法实现了它。我不知道(手动)删除该行为是否真的有必要。如果它被停止,它将不再被执行。一旦用户打开一个新页面,这些行为就消失了。