0

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

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 的新手,所以如果您有更好的方法来获得相同的结果,如果您能与我分享,我将不胜感激。

4

1 回答 1

2

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

编辑:

如果仅在出现新通知时调用“刷新()”函数,则可以在页面上设置一个标志(在页面上定义布尔变量,并在出现新通知时将其更改为 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;
}

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

于 2013-09-05T04:58:37.327 回答