Java Wicket';s AjaxSelfUpdatengTimerBehavior在离开并重新进入页面后停止更新

Java Wicket';s AjaxSelfUpdatengTimerBehavior在离开并重新进入页面后停止更新,java,web,wicket,Java,Web,Wicket,我已将此行为添加到组件(MarkupContainer) ajaxselfUpdatengTimerbehavior updateBehavior=新的ajaxselfUpdatengTimerbehavior(持续时间.秒(3)) { @凌驾 public void onEvent(组件、IEvent事件){ //一些商业逻辑 } }; 在某个地方,在同一个页面上,我有一个AjaxLink,它重定向到另一个页面(在该页面中,我将实际页面作为参数传递给构造函数),在该页面上,我有一个“Back

我已将此行为添加到组件(MarkupContainer)

ajaxselfUpdatengTimerbehavior updateBehavior=新的ajaxselfUpdatengTimerbehavior(持续时间.秒(3))
{
@凌驾
public void onEvent(组件、IEvent事件){
//一些商业逻辑
}
};
在某个地方,在同一个页面上,我有一个AjaxLink,它重定向到另一个页面(在该页面中,我将实际页面作为参数传递给构造函数),在该页面上,我有一个“Back”AjaxLink,它将我重定向回,调用
setResponsePage(myFirstPage)


问题是,即使在呈现页面时,该行为会更新一次,但它会在3秒后停止更新一次,这是为的。在离开页面之前,该行为不会出现任何问题。

可能不是最佳解决方案,但我通过删除行为
onBeforeRender()成功修复了它
,然后再次添加。我在页面
private int autoUpdateBehaviorId=-1上声明了一个字段

public void addUpdateBehavior(Component c)
{
    if(autoUpdateBehaviorId >= 0)
        c.remove(c.getBehaviorById(autoUpdateBehaviorId));


    AjaxSelfUpdatingTimerBehavior updateBehavior = new AjaxSelfUpdatingTimerBehavior(Duration.seconds(3))
    {

        @Override
        public void onEvent(Component component, IEvent<?> event) {
            // bussines logic
        }
    };
    c.add(updateBehavior);
    autoUpdateBehaviorId = c.getBehaviorId(updateBehavior);
}


@Override
protected void onBeforeRender() {
    super.onBeforeRender();
    addUpdateBehavior(myContainer);
}
public void addUpdateBehavior(组件c)
{
如果(自动更新行为ID>=0)
c、 删除(c.getBehaviorById(autoUpdateBehaviorId));
AjaxSelfUpdatengTimerBehavior updateBehavior=新的AjaxSelfUpdatengTimerBehavior(持续时间.秒(3))
{
@凌驾
public void onEvent(组件、IEvent事件){
//商业逻辑
}
};
c、 添加(更新行为);
autoUpdateBehaviorId=c.getBehaviorId(updateBehavior);
}
@凌驾
受保护的void onBeforeRender(){
super.onBeforeRender();
addUpdateBehavior(myContainer);
}

不一定是问题的解决方案;但我通过覆盖AjaxSelfUpdatengTimerBehavior的onConfigure方法实现了该行为,如下所示

在我的例子中,我必须每10秒用队列中的当前记录数更新标签

以下是代码片段:

labelToBeUpdated.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(configurableDelay)) {
        @Override
        public void onConfigure(Component component) {
            String inProgressOutOfTotal = "10/100"; //Business logic to get total count and inprogress count    
            labelToBeUpdated.setDefaultModel(Model.of(inProgressOutOfTotal));

            //Set visibility of the component if needed
        }   
    }
    labelToBeUpdated.setOutputMarkupId(true);
只是好奇;是OneEvent正在等待组件上的事件以便刷新吗?由于onConfigure是在渲染周期开始之前调用的,所以它对我来说是有效的


但正如Sven Meier所提到的,您可能仍然希望按照他的建议使用OneEvent获取代码

我看不出有什么理由没有变通办法就不能工作。您能否创建一个快速启动并将其附加到Jira问题?
labelToBeUpdated.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(configurableDelay)) {
        @Override
        public void onConfigure(Component component) {
            String inProgressOutOfTotal = "10/100"; //Business logic to get total count and inprogress count    
            labelToBeUpdated.setDefaultModel(Model.of(inProgressOutOfTotal));

            //Set visibility of the component if needed
        }   
    }
    labelToBeUpdated.setOutputMarkupId(true);