我在向表单动态添加组件时遇到问题。我想做的是: 为用户提供一个下拉列表,其中包含他们可以选择的项目,例如姓名、年龄...
当用户按下添加时:在 1 个组件中出现一个 (label + inputbox) 允许他们输入值。您可能认为我可以隐藏那些未被选中的组件,但用户也可以向下拉列表中添加值。
我遇到的问题是如何在 HTML 中没有 wicket:ids 的情况下添加和删除组件(label+ inputbox)?
这是我要添加的内容:
<wicket:panel>
<div wicket:id="hldValue">
<label wicket:id="lblValue"></label>
<input type="text" wicket:id="value"/>
</div>
</wicket:panel>
我在这里遇到的问题是 ID 始终是我要动态命名的值。使用动态 HTML 来创建这个组件是个好主意吗?我正在覆盖 getMarkupResourceStream
和 getCacheKey
来实现这一点。我仍然觉得这不是正确的方法。还有其他建议吗?
最佳答案
你需要一个 ListView,因为你可以有面板类型,一个你用 ListView 添加逻辑的模型,至少 2 个表单,一个用于 DropDown,用户在其中选择数据也添加,最后另一个用于提交整个 ListView 的数据。您可以使用 AJAX,但它是可选的
要了解如何将转发器(ListView 是一种高级转发器)与表单组件一起使用,您可以查看 here了解他的基本用法,here感谢他对表单组件的使用,最后 here了解如何将其与 AJAX 一起使用。
顺便说一句,我有一个例子,这里只是代码的关键部分。
这是 ListView.class 上的 populateItem 方法
@Override
protected void populateItem(ListItem<ListViewModel> item) {
item.add(new TextField<Integer>("quantity", new PropertyModel<Integer>(item.getDefaultModelObject(),
"averageQuantity"));
item.add(new TextField<Integer>("position", new PropertyModel<Integer>(item.getDefaultModelObject(), "order"))
.add(new IntegerValidator()));
item.add(new Label("description", item.getModelObject().getName()));
item.setOutputMarkupId(true);
}
在其他地方,您应该将下拉列表添加到他自己的表单中,然后在提交时操作 listView 对象,例如
// I use a AjaxButton to perform the user submit if you don't
// want use it, you should reload the entire page
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
//redraw the parent of the list view
target.add(theContainerOfTheListView);
//the submited model of the dropdown
ListViewModel item = form.getObject();
List<ListViewModel> list = listViewObject.getObject();
list.add(item);
//you could sort the list object in order to sort the listViewObject
}
更新:在将新项目添加到 ListView 之前,您应该提交 ListView 的表单组件,如果您不这样做,您将丢失用户更改
关于java - Wicket动态添加组件到表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13419494/