Wicket动态添加组件以形成

时间:2012-11-16 15:23:54

标签: java wicket

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

当用户按下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>

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

2 个答案:

答案 0 :(得分:6)

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

为了知道如何使用带有表单组件的转发器(ListView是高级转发器),您可以检查here以了解其基本用法,here了解其对表单组件的使用情况,最后{{ {3}}知道如何在AJAX中使用它。

BTW我有一个例子,这里只是代码的关键部分。

这是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
 }

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

答案 1 :(得分:2)

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

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

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