Wicket动态添加组件以形成

我无法动态地向表单添加组件。 我要做的是:给用户一个下拉列表,其中包含他可以选择的项目,如姓名,年龄,……

当用户按下add时,在1个组件中出现一个(标签+输入框),允许他输入值。 您可能认为我可以隐藏未选择的组件,但用户也可以向下拉列表中添加值。

我遇到的问题是如何添加和删除组件(标签+输入框)而不使用wicket:HTML中的ID?

这是我想要添加的内容:

 

我在这里遇到的问题是ID始终是我想要动态命名的值。 使用动态HTML创建这个组件是个好主意吗? 我重写了getMarkupResourceStreamgetCacheKey来实现这一点。 我仍觉得这不是正确的方法。 还有其他建议吗?

你需要一个ListView,因为你可以拥有类型的面板,一个模型,你用listview添加逻辑,至少有2个表单,一个用于DropDown,用户选择数据太多,最后另一个用于提交整个数据列表显示。 你可以使用AJAX但是可选的

为了知道如何使用中继器(ListView是一个高级中继器)和表单组件,你可以在这里查看它的基本用法, 这里是他对表单组件的使用,最后是知道如何在AJAX中使用它。

顺便说一下,我有一个例子,这里只是代码的关键部分。

这是ListView.class上的populateItem方法

  @Override protected void populateItem(ListItem item) { item.add(new TextField("quantity", new PropertyModel(item.getDefaultModelObject(), "averageQuantity")); item.add(new TextField("position", new PropertyModel(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 list = listViewObject.getObject(); list.add(item); //you could sort the list object in order to sort the listViewObject } 

更新:在将新项目添加到列表视图之前,您应该提交列表视图的表单组件,如果您不这样做,您将松开用户更改

您不必在页面中添加/删除组件。 可以使组件动态可见/不可见。 使用setVisible(false)使组件不可见。 这将是他们的初始状态。

您还需要在要动态隐藏/显示的组件上调用setOutputMarkupPlaceholderTag(true)

当您需要组件可见时,请调用setVisible(true) 。 这可以通过Ajax按钮的onClick()方法触发。