在提交之前从外部源修改ListView

时间:2015-08-20 18:43:51

标签: java wicket wicket-6

我有一个包含此示例的列表视图,可以说5行。列表视图采用表单形式,并具有用于删除行的AjaxSubmitLink。

加载的数据来自可加载的可拆卸模型,该模型从数据库加载行。

用户A:使用删除按钮呈现加载所有5行的列表。

用户B:在另一台机器上加载相同的列表并删除第3行。

用户A:仍然看到所有5行并删除第4行。模型重新连接,而不是第4行被删除。第5行被删除。

Form<Void> form = new Form<Void>("form");
form.setOutputMarkupId(true);
add(form);

ListView<Data> list = new ListView<Data>("list", detachableDataList)
{
        private static final long serialVersionUID = 1L;

        protected void populateItem(final ListItem<Data> item)
        {
            AjaxSubmitLink delete = new AjaxSubmitLink("delete")
            {
                protected void onSubmit(AjaxRequestTarget target, Form<?> form)
                {
                    Data data = item.getModelObject();
                    DB.delete(data.getPk());
                    target.add(form);
                }
            }
        }
}
form.add(list);

尝试使用setReuseItems(true) 尝试使用RefreshingView 试图覆盖getListItemModel

这些都不起作用

为尝试清晰度编辑

Item 1 [delete]
Item 2 [delete]
Item 3 [delete]
Item 4 [delete]
Item 5 [delete]

当我点击第4项的删除时,它适用于第5项,因为第3项已被其他用户删除。

3 个答案:

答案 0 :(得分:1)

您拥有Data,因此请使用它。

protected void populateItem(ListItem<Data> item)
    {
        Data data = item.getModelObject();
        final Serializable id = data.getId(); // the primary key
        AjaxSubmitLink delete = new AjaxSubmitLink("delete")
        {
            protected void onSubmit(AjaxRequestTarget target, Form<?> form)
            {
                DB.delete(id);
                target.add(form);
            }
        }
    }

答案 1 :(得分:1)

您是否可以覆盖getListItemModel

protected IModel<T> getListItemModel(final IModel<? extends List<T>> listViewModel,
        final int index)
{
    // Change the line below to track your model by a Pk or Id instead of index
    return new ListItemModel<T>(this, index);
}

答案 2 :(得分:1)

您可以在呈现列表时获取Data对象,而不是在用户单击delete

时获取它
    protected void populateItem(final ListItem<Data> item)
    {
        final Data data = item.getModelObject();
        AjaxSubmitLink delete = new AjaxSubmitLink("delete")
        {
            protected void onSubmit(AjaxRequestTarget target, Form<?> form)
            {                
                DB.delete(data.getId());
                target.add(form);
            }
        }
    }