如何从Wicket数据表中获取所有模型对象

时间:2011-11-10 18:06:24

标签: java wicket

我正在使用Wicket DefaultDataTable。它包含一些用户应该将值放入的文本字段。表格是一种形式。当我提交表单时,我希望获得所有“行”,以便我可以遍历它们。我不想使用AJAX。

我设法将表绑定到“Contact”对象,EditablePropertyColumn在我想要的列中显示正确的字段和输入框。

如何获取行项目?提交表单时dataTable.getDefaultModelObject()会返回null

4 个答案:

答案 0 :(得分:3)

老实说,听起来你有一些其他(更基本的)错误。正如martin-g所提到的,editable属性列使用属性模型,这意味着当提交表单时(如果所有验证等都通过),它将在该模型上调用setObject,而后者将调用setFoo(其中“ POJO上的foo“是该列的属性”,它支持表中的那一行数据。

你可以(如唐提到的那样)使用访问者来遍历你桌子上的孩子。但是,一般来说,这意味着你做错了什么。编写Wicket是为了让您不必从表单提交中提取数据并将其自己推送到您的POJO上。该模型应该为您做到这一点。你不应该在自己周围“推”数据。

显示一些代码会有所帮助,但缺少这一点:无论您的表从哪里获取数据(某些联系人列表等) - 尝试从这些对象中提取数据。它应该已经填好了。如果不是,请发布一些代码 - 尤其是在初始化表及其数据提供者的地方。

答案 1 :(得分:2)

提交的数据填充在Contact对象中。这就是PropertyColumn的工作原理。

答案 2 :(得分:1)

DefaultDataTable在该方法中有一个方法newRowItem,你可以捕获表中显示的模型:

  private List<IModel<T>> models= new LinkedList<IModel<T>>();
    @Override
    protected Item<T> newRowItem(final String id, int index,
            final IModel<T> model) {
              models.add(model);
    }

答案 3 :(得分:0)

如果你展示了你已经获得的代码,那么具体化会更容易,但我可以想到两种通用方法。

一种方法是在构建它时在DefaultDataTable之外的某个地方维护一个对模型的引用列表。

如果很难找到一种方法,另一种可能的方法是使用Wicket IVisitor的实现来搜索数据表中的组件以查找包含模型的组件。

WebMarkupContainer类有一个方法

public final <S extends Component> Object visitChildren(final Class<?> clazz,
    final IVisitor<S> visitor)

可用于遍历特定类的所有包含组件,以及方法

public final Object visitChildren(final IVisitor<Component> visitor)

执行相同但不限于特定类。

IVisitor<T extends Component>界面要求您定义方法

public Object component(T component)

由这些“访问”方法调用,每个组件都作为参数找到。返回值是继续或退出遍历的信号,您定义的方法可以将它在组件中找到的内容收集到列表中。