jsf - p:selectManyMenu(with checkbox):同时添加item和select checkbox
问题描述
xhtml代码
<p:selectManyMenu id="menuid"
value="#{bean.selectedActivities}"
showCheckbox="true" scrollable="true" scrollHeight="150">
<f:selectItems value="#{bean.activities}" var="activity" itemValue="#{activity}"
itemLabel="#{activity}" />
</p:selectManyMenu>
<p:commandButton value="ADD ACTIVITY" id="addId">
<p:ajax event="click" process="@this" update="menuid" listener="#{bean.addActivity()}"/>
</p:commandButton>
豆:
private List<String> selectedActivities = new ArrayList<>();
private List<String> activities = new ArrayList<>();
int index = 1;
public void addActivity(){
String activity = "Activity "+ (index ++);
activities.add(activity);
selectedActivities.add(activity);
}
此代码正在向 manyMenu 添加新项目,但未选中复选框。
解决方案
除了一些缺失的注释,我看不出有什么错误。无论如何,这是一个基于您的代码的经过测试的解决方案,应该可以工作。首先让我们定义视图。这与您的示例基本相同:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>SelectMany Example</title>
</h:head>
<h:body>
<h:form>
<p:selectManyMenu id="menuid"
value="#{selectManyBackingBean.selectedActivities}"
showCheckbox="true" scrollable="true" scrollHeight="150">
<f:selectItems value="#{selectManyBackingBean.activities}" var="activity" itemValue="#{activity}"
itemLabel="#{activity}" />
</p:selectManyMenu>
<p:commandButton value="ADD ACTIVITY" id="addId">
<p:ajax event="click" process="@form" update="menuid"
listener="#{selectManyBackingBean.onAddActivity}"/>
</p:commandButton>
</h:form>
</h:body>
</html>
然后,我们定义支持 bean:
@Data
@Named
@ViewScoped
public class SelectManyBackingBean implements Serializable {
private List<String> selectedActivities;
private List<String> activities;
private int index;
@PostConstruct
private void init() {
activities = new ArrayList<>();
selectedActivities = new ArrayList<>();
index = 0;
}
public void onAddActivity(){
String activity = "Activity " + (index++);
activities.add(activity);
selectedActivities.add(activity);
}
}
这应该会给你预期的行为。现在,在“添加活动”按钮上单击 3 次会产生以下结果:
process="@this"
注意命令按钮从到的细微变化process="@form"
。这将确保您在组件中所做的任何更改也包含在表单提交中。如果你保持它的原始值,任何点击菜单中的复选框都不会被保留,并且当你按下命令按钮时会将条目重置为之前的值(这是因为有问题的组件在生命周期中不包括在内)循环执行)。
推荐阅读
- node.js - MongoDB 和 Mongoose 连接 URL 格式错误,无法解析的错误消息
- python - 如何对缩放的绘图区域进行计算
- javascript - 按钮自动点击功能在移动设备上不起作用
- css - 在 CSS display:table 中,如何保持一致的单元格宽度?
- titanium - Titanium ListView 模板条件渲染
- ios - 即使有足够的空间可用于单词,UILabel 自动换行功能也会留下空间
- postgresql - Postgres & FULL TEXT SEARCH:搜索具有多个否定短语的短语的正确 SQL 查询是什么
- javascript - Angular 6中带有上一个和下一个按钮的水平滚动
- java - 为什么在使用方法引用时动作监听器会给出不同的结果?
- crystal-reports - 水晶报告如何在详细部分显示每条记录的页眉和页脚