【问题标题】:Wicket - Update item inside listview with ajax timerWicket - 使用 ajax 计时器更新列表视图中的项目
【发布时间】:2013-02-19 14:08:09
【问题描述】:

wicket-example http://www.wicket-library.com/wicket-examples/ajax/world-clock?0 上有一个世界时钟示例。

我尝试了相同的方法,但在列表视图中。

    final DataView<LongRunningTask> dataView = new DataView<LongRunningTask>("sorting", adp) {
        private static final long serialVersionUID = 1L;

        @Override
        protected void populateItem(final Item<LongRunningTask> item) {
            ...
                final Label clock = new Label("timer", getCounter().getObject());

                item.add(clock);
                clock.setOutputMarkupId(true);
                add(new AbstractAjaxTimerBehavior(Duration.seconds(1)) {

                    @Override
                    protected void onTimer(AjaxRequestTarget target) {
                        target.add(clock);
                    }
                });
                ...
            }

        }
    };

但这不起作用。如果我这样做了

 add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(1)));

在页面本身内部,然后它就可以工作了。但是我不想每秒刷新页面,我只想刷新listView里面的一项(时钟)。

我有什么办法可以做到这一点?

【问题讨论】:

    标签: ajax listview timer wicket


    【解决方案1】:

    解决这个问题最简单的方法是将 Behavior 添加到时钟而不是周围的容器中。

    您每行将行为添加到 DataView 一次。由于 DataViews 不能通过 Ajax 更新,这必然会失败。而是更新时钟组件本身。

    final DataView<LongRunningTask> dataView = new DataView<LongRunningTask>("sorting", adp) {
        private static final long serialVersionUID = 1L;
    
        @Override
        protected void populateItem(final Item<LongRunningTask> item) {
            ...
                final Label clock = new Label("timer", getCounter().getObject());
    
                item.add(clock);
                clock.setOutputMarkupId(true);
                clock.add(new AbstractAjaxTimerBehavior(Duration.seconds(1)) {
    
                    @Override
                    protected void onTimer(AjaxRequestTarget target) {
                        target.add(clock);
                    }
                });
                ...
            }
    
        }
    };
    

    再看一遍后,我认为还有另一个罪魁祸首:

    final Label clock = new Label("timer", getCounter().getObject());
    

    我不确切知道 getCounter().getObject() 的作用,但很可能它不会返回模型...

    final Label clock = new Label("timer", new PropertyModel(this, "counter"));
    

    应该更适合这里。您可能需要将“this”替换为带有适当前缀的版本,以确保定义 getCounter() 的容器已被寻址。

    如果这不起作用,请查看您的 AjaxDebugWindow。您应该会看到每秒都有数据。如果不是,您的组件不会更新。如果数据未更改,则您的模型不会更新。有了这个,你应该可以轻松解决这个问题。

    【讨论】:

    • 实际上它的 task.getCounter() 其中 task 是另一个 java 类...并且 task.getCounter().getObject() 返回一个字符串...因为时钟标签的第二个参数应该是一个字符串...
    • 它现在适用于 new PropertyModel(task,"counter.object");谢谢:)
    【解决方案2】:

    您必须刷新 DataView,为此将其添加到 WebMarkupContainer 并使用 ajax 计时器行为定位 WebMarkupContainer。

    第二种方法是将标签和 ajax 计时器行为添加到新面板。然后将该面板添加到您的 DataView。我不确定这种方法是否可行,因为我以前从未尝试过,但值得一试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      相关资源
      最近更新 更多