在我的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的新手,所以如果你有更好的方法来达到相同的效果,如果你能与我分享,我将不胜感激。
答案 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;
}
这样容器不会经常刷新(这可能会导致奇怪的效果)并且每次出现新通知时都会刷新。