如何获取ListView项的所有值及ListView内所有TextField组件的值?
如何获取ListView项的所有值及ListView内所有TextField组件的值?
嘿,我来给你捋捋怎么搞定这个Wicket里的需求!
首先分两种场景来说——一种是你想拿到所有渲染出来的TextField组件实例,另一种是想直接获取这些输入框里的用户输入值,咱们一个个来:
一、获取ListView内所有TextField组件实例
你可以直接遍历ListView的所有列表项,再从每个项里定位到你要的TextField:
- 先通过
list.getItems()拿到ListView下的所有ListItem集合 - 循环每个ListItem,用
item.get("firstname")根据组件id获取对应的TextField,记得强转类型 - 把这些组件收集到列表里就行
代码示例如下:
// 准备一个列表来存所有TextField List<TextField<String>> allFirstNameFields = new ArrayList<>(); // 遍历ListView的所有项 for (ListItem<String> listItem : list.getItems()) { // 根据组件id获取TextField,注意强转 TextField<String> firstNameField = (TextField<String>) listItem.get("firstname"); allFirstNameFields.add(firstNameField); }
二、获取所有TextField的输入值
这里更推荐从模型中取值,毕竟Wicket是模型驱动的框架,这才是符合框架设计理念的做法:
如果你的ListView是绑定到一个用户列表模型(比如IModel<List<User>>,User类有firstname属性),那用户在输入框里填的值会自动同步到模型对象中,你直接从模型拿数据就好,比从组件里取要靠谱得多:
// 从ListView的模型中拿到用户列表 List<User> userList = list.getDefaultModelObjectAs(List.class); // 提取所有用户的firstname值 List<String> allFirstNames = userList.stream() .map(User::getFirstname) .collect(Collectors.toList());
要是你非得从组件实例中取值(比如某些特殊场景),也可以在刚才的组件遍历循环里,调用组件的getModelObject()方法:
List<String> allFirstNames = new ArrayList<>(); for (ListItem<String> listItem : list.getItems()) { TextField<String> firstNameField = (TextField<String>) listItem.get("firstname"); allFirstNames.add(firstNameField.getModelObject()); }
小提示
- 一定要确保在合适的时机执行这些操作,比如在表单的
onSubmit()方法里——这时候用户提交的输入值已经同步到模型/组件中了,拿到的才是最新的用户输入 - 优先用模型驱动的方式处理数据,尽量避免直接操作组件实例,这样你的代码会更健壮,也更符合Wicket的设计逻辑
内容来源于stack exchange
相关产品推荐
相关产品推荐

