【问题标题】:Wicket - ListView not getting updatet, when new instances are addedWicket - 添加新实例时,ListView 未更新
【发布时间】:2013-02-27 01:54:12
【问题描述】:

在我的面板中,我将 listView 添加到具有可拆卸模型的表中:

编辑:

public class TaskDetailsPanel extends Panel {
    ...

  public TaskDetailsPanel(String id, CompoundPropertyModel<LongRunningTask> model) {
    super(id, model);
    Task task = (LongRunningTask) getDefaultModelObject();

    List<Timeframe> testList = task.getTimeframes();

   DetachableTimeframeModel dtm = new DetachableTimeframeModel(new Model<Task>(task));
    ListView frames = new ListView("frame", dtm) {
        @Override
        protected void populateItem(ListItem item) {
            Timeframe tf = (Timeframe) item.getModelObject();
            item.add(new Label("time", "von - bis"));
            item.add(new Label("sentFiles", String.valueOf(tf.getSentFiles())));
            item.add(new Label("receivedFiles", String.valueOf(tf.getReceivedFiles())));
            item.add(new Label("missingMsgIds", String.valueOf(tf.getMissingMsgIds())));
            item.add(new Label("receivedMsgIds", String.valueOf(tf.getReceivedMsgIds())));
        }
    };
        frames.setOutputMarkupId(true);
        add(frames);

       ...
    }
}

这是我的自定义 detable 模型:

class DetachableTimeframeModel extends LoadableDetachableModel {

    LongRunningTask task;

    public DetachableTimeframeModel(LongRunningTask t) {
        task = t;
    }

    @Override
    protected List<Timeframe> load() {
        return task.getTimeframes();
    }
}

当我在面板内定义一个新列表 List(例如 ArrayList)并向其中添加项目时,它就可以工作了。但是当列表来自另一个 javabean 时它会失败。

我错过了什么?

【问题讨论】:

  • 什么失败了,你确定javabean实际上是在返回列表中的值吗?

标签: listview model wicket detach


【解决方案1】:

将包含 longRunningTask 的模型传递给 DetachableTimeframeModel。

在 Wicket 中,您永远不应该从模型中取出某些东西只是为了将其放入另一个模型中:

class DetachableTimeframeModel extends LoadableDetachableModel {

    IModel<LongRunningTask> task;

    public DetachableTimeframeModel(IModel<LongRunningTask> t) {
        task = t;
    }

    @Override
    protected List<Timeframe> load() {
        return task.getObject().getTimeframes();
    }

    public void detach() {
        super.detach(),

        task.detach();
    }
}

请注意,传递给 TaskDetailsPanel 的构造函数的模型应该能够从某个地方加载实际任务,而不仅仅是持有对它的引用。 Wicket 组件和模型被序列化到会话/页面存储中。

【讨论】:

  • hmm 我这样做了,但是现在 task.getObject() 返回 null ...并且我通过 getTimeFrames() 获得的列表大小始终为 0。但列表大小不是 0,我调试了它在我的 Counter java 类中。所以 detachableModel 似乎没有得到实际的任务。我在我的帖子中进行了编辑,在 TaskDetailsPanel 中。我的任务是:Task task = (LongRunningTask) getDefaultModelObject();并将其传递给 DetachableModel,如下所示: DetachableTimeframeModel dtm = new DetachableTimeframeModel(new Model(task));但它仍然无法正常工作......
猜你喜欢
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 2019-10-07
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多