Wicket 9.6中如何通过单个按钮为ListMultipleChoice每项打开新标签页
问题:点击搜索按钮为ListMultipleChoice选中元素批量打开新标签页
在HomePage页面中使用ListMultipleChoice组件,需求是点击「搜索」按钮时,为组件中选中的每一个元素打开一个独立的新标签页。目前已能正常获取所有选中元素的数据,但尝试过以下方式均未成功:
- 在多处添加
target="_blank"属性 - 循环调用
setResponsePage方法
以上操作都只能打开第一个选中元素对应的新标签页。
现有相关代码
HomePage.html
<select wicket:id="dataElement" class="form-control chosen-select" multiple data-placeholder="Select Data Elements" required> <option value=""></option> </select>
HomePage.java
ChoiceRenderer<DataElement> dataElementChoiceRenderer = new ChoiceRenderer<>( "displayValue"); ListMultipleChoice<DataElement> regSelect = new ListMultipleChoice<>("dataElement", this.dataElementModel, dataElementChoiceRenderer); AjaxButton searchButton = new AjaxButton("search", f) { @Override protected void onSubmit(AjaxRequestTarget target) { Collection<DataElement> convertedInput = regSelect.getConvertedInput(); if (!convertedInput.isEmpty()) { setResponsePage(ResultsPage.class, params); } } };
解决方法
核心思路是通过注入JavaScript代码实现批量打开新标签页,修改AjaxButton的onSubmit方法如下:
AjaxButton searchButton = new AjaxButton("search", f) { @Override protected void onSubmit(AjaxRequestTarget target) { Collection<DataElement> convertedInput = regSelect.getConvertedInput(); if (!convertedInput.isEmpty()) { // 遍历每个选中元素,生成对应URL并注入打开新标签页的JS for (DataElement element : convertedInput) { // 构建当前元素对应的页面参数,根据业务需求调整 PageParameters params = new PageParameters(); params.add("elementId", element.getId()); // 示例参数,替换为实际字段 Url url = getRequestCycle().mapUrlFor(ResultsPage.class, params); // 生成打开新标签页的JS代码 String openTabScript = "window.open('" + url + "', '_blank');"; target.appendJavaScript(openTabScript); } } } };
原理说明
Wicket的setResponsePage仅能处理一次页面跳转,无法实现批量打开新标签页。通过target.appendJavaScript()向前端注入window.open()脚本,循环处理每个选中元素,即可为每个元素打开独立的新标签页。
内容的提问来源于stack exchange,提问作者farmerbenny
相关产品推荐
相关产品推荐

