提交前从外部源修改的 ListView
ListView modified from outside source before submit
我有一个包含此示例的列表视图,可以说是 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
None 个有效
为了清晰起见编辑
Item 1 [delete]
Item 2 [delete]
Item 3 [delete]
Item 4 [delete]
Item 5 [delete]
当我在项目 4 上单击删除时,它适用于项目 5,因为项目 3 已被另一个用户删除。
您有 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);
}
}
}
你能覆盖 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);
}
您可以在呈现列表时获取 Data 对象,而不是在用户单击删除时获取它
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);
}
}
}
我有一个包含此示例的列表视图,可以说是 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
None 个有效
为了清晰起见编辑
Item 1 [delete]
Item 2 [delete]
Item 3 [delete]
Item 4 [delete]
Item 5 [delete]
当我在项目 4 上单击删除时,它适用于项目 5,因为项目 3 已被另一个用户删除。
您有 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);
}
}
}
你能覆盖 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);
}
您可以在呈现列表时获取 Data 对象,而不是在用户单击删除时获取它
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);
}
}
}