gpt4 book ai didi

java - Wicket ListView ajax 删除总是删除列表中的最后一个元素

转载 作者:行者123 更新时间:2023-11-30 03:14:56 25 4
gpt4 key购买 nike

我有办法在 ListView 中添加面板。每个面板都与一个 Type 类型的对象关联。我有一个“添加”和一个“删除”AjaxSubmitLinks。两者都有 setDefaultFormProcessing(false) ,因为我希望当有人添加或删除元素时保留未提交/验证的值。 setReuseItems(true) 是为 ListView 设置的。请参阅下面的代码片段。

         ListView itemContainer = new ListView<Type>("list", getList()) {
@Override
protected void populateItem(final ListItem<Type> listItem) {
final Component element = createComponent(listItem.getModel());
listItem.add(element);
listItem.add(new AjaxSubmitLink("remove") {

@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
getList().remove(listItem.getIndex());
target.add(wrapper);
}
}.setDefaultFormProcessing(false));
}
};
itemContainer.setReuseItems(true);
add(itemContainer);
add(new AjaxSubmitLink("add") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
Type object = addObject();
getList().add(object);
target.add(wrapper);
}

@Override
public boolean isVisible() {
return getList().size() < DSAddableField.this.max && isEditable();
}
}.setDefaultFormProcessing(false));

包装器包含所有内容,因此所有内容都通过 Ajax 重新加载。一切正常,除了无论我单击哪个删除链接,最后一个元素都会被删除。基于 UUID 检查的 Type 上重写 equals() 方法。我进行了调试,在我看来,正确的元素已从 ListModel 中删除,但 ajax 响应发送了错误的值。

我怎样才能让它发挥作用?我尝试删除 setReuseItem(true),但未重新加载列表项的未保存值。 (面板包含很多输入字段)

有什么建议吗?

更新:

我已经尝试使用 getList().remove(listItem.getModelObject()) 删除对象,这是第二种解决方案,但仍然失败。

无论我使用按索引删除还是按模型对象删除,使用调试器时都会从列表中删除正确的元素。

UDAPTE 2:

如果我删除“final int index = listItem.getIndex();”与最后一个元素相反,正确的元素被删除,但是当我向列表中添加一个新元素时,未保存的输入被清除,这是我试图解决的原始问题。请指教。

最佳答案

这是您的第二次编辑:
如果您使用 target.add(wrapper); 您会读取整个组件并重新渲染它。如果将 populateItem 放入 WebMarkupContainer 中,则只能重新渲染此项。

protected void populateItem(final ListItem<Type> listItem) {
WebMarkupContainer cont = new WebMarkupContainer("cont");
cont.setOutputMarkupId(true);
cont.setOutputMarkupPlaceholderTag(true);
final Component element = createComponent(listItem.getModel());
cont.add(element);
cont.add(new AjaxSubmitLink("remove") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
getList().remove(listItem.getIndex());
target.add(cont);
}
}.setDefaultFormProcessing(false));
listItem.add(cont);
}

关于java - Wicket ListView ajax 删除总是删除列表中的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32876963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com