【问题标题】:Updating a Wicket WebMarkupContainer更新 Wicket WebMarkupContainer
【发布时间】:2013-09-04 19:12:47
【问题描述】:

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

【问题讨论】:

    标签: java wicket


    【解决方案1】:

    您必须在计时器上执行此操作。使用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;
    }
    

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

    【讨论】:

    • 感谢您的回复。当然可以通过按照您的指示添加时间行为来做到这一点,但是在 refresh() 方法中获取新通知是一项涉及数据访问层的昂贵操作,所以我宁愿不要一遍又一遍地为每个用户执行相同的过程.我确定的是,当用户收到新通知时,将调用刷新方法。
    • 好的,通过实施您的修订,我们将避免对容器进行不必要的刷新。似乎无法避免定期重复该过程。再次感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2012-08-18
    相关资源
    最近更新 更多