更新Wicket WebMarkupContainer

时间:2013-09-04 19:12:47

标签: java wicket

在我的Wicket网页中,我有一个包含ListView的WebMarkupContainer:

notifications = new ArrayList<Notification>(...);
ListView listView = new ListView("notification", notifications) {
    @Override
    protected void populateItem(ListItem item) {
        ...
    }
};

container = new WebMarkupContainer("container");
container.setOutputMarkupId(true);
container.add(listView);
this.add(container);

WebMarkupContainer已经到位,以便让我动态更新屏幕上向用户显示的项目列表。当用户点击链接或将容器添加到传入的AjaxRequestTarget时,就可以这样做。

现在我需要在没有Ajax请求的情况下更新列表:

public void refresh() {
    List<Notification> newNotifications = ... 
    notifications.addAll(0, newNotifications);
}

此方法在运行时环境中调用,通知列表(我的网页的私有字段(与最后一个代码相同))将包含新对象。我希望向用户显示这些新项目。是否可以更新(或重新渲染)容器?

我是Wicket的新手,所以如果你有更好的方法来达到相同的效果,如果你能与我分享,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

您必须在计时器上执行此操作。使用AjaxSelfUpdatingTimerBehavior执行此操作。只需设置一些合理的持续时间,并使用'onTimer()'方法将容器添加到目标。

编辑:

如果仅在出现新通知时调用'refresh()'函数,则可以在页面上设置一个标志(在页面上定义布尔变量并在新通知出现时将其更改为true,并在刷新listView后将其更改为false) 。然后你可以设置行为的短持续时间,'onTimer()'看起来像这样:

onTimer(AjaxRequestTarget target) {
    if(newNotifications) {
        target.add(container);
        newNotifications = false;
    }
}

刷新

public void refresh() {
    List<Notification> newNotifications = ... 
    notifications.addAll(0, newNotifications);
    newNotifiactions = true;
}

这样容器不会经常刷新(这可能会导致奇怪的效果)并且每次出现新通知时都会刷新。