我无法动态地向表单添加组件.我要做的是:给用户一个下拉列表,其中包含他可以选择的项目,如姓名,年龄,......
当用户按下add时,在1个组件中出现一个(标签+输入框),允许他输入值.您可能认为我可以隐藏未选择的组件,但用户也可以向下拉列表中添加值.
我遇到的问题是如何添加和删除组件(标签+输入框)而不使用wicket:HTML中的ID?
这是我想要添加的内容:
<wicket:panel>
<div wicket:id="hldValue">
<label wicket:id="lblValue"></label>
<input type="text" wicket:id="value"/>
</div>
</wicket:panel>
Run Code Online (Sandbox Code Playgroud)
我在这里遇到的问题是ID始终是我想要动态命名的值.使用动态HTML创建这个组件是一个好主意吗?我压倒一切getMarkupResourceStream,getCacheKey实现这一目标.我仍觉得这不是正确的方法.还有其他建议吗?
你需要一个ListView,因为你不能有类型的面板,一个模型,你用listview添加逻辑,至少2个表单,一个用于DropDown,用户选择数据也添加,最后另一个用于提交整个数据列表显示.你可以使用AJAX但是可选的
为了知道如何使用中继器(ListView控件是一种先进的中继器)与表格组件,您可以查看这里了解他的基本用法,在这里,他与表单组件的使用,最后在这里了解如何使用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);
}
Run Code Online (Sandbox Code Playgroud)
在其他地方你应该将下拉列表添加到他自己的表单,然后在提交操作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
}
Run Code Online (Sandbox Code Playgroud)
更新:在将新项目添加到列表视图之前,您应该提交列表视图的表单组件,如果您不这样做,您将松开用户更改
| 归档时间: |
|
| 查看次数: |
10301 次 |
| 最近记录: |