List 如何基于标志启用/禁用selecManyCheckbox中的项目
在jsf页面中禁用和启用selectManyCheckbox组件中的项目时,我需要您的帮助。首先,selectManyCheckbox组件显示了三个复选框,它们是贷款-健康-转移。该列表将从包含以下代码的bean中填充:List 如何基于标志启用/禁用selecManyCheckbox中的项目,list,jsf,primefaces,selectmanycheckbox,List,Jsf,Primefaces,Selectmanycheckbox,在jsf页面中禁用和启用selectManyCheckbox组件中的项目时,我需要您的帮助。首先,selectManyCheckbox组件显示了三个复选框,它们是贷款-健康-转移。该列表将从包含以下代码的bean中填充: private List<hrCertificate> hrCertificatesList = new ArrayList<hrCertificate>(); //Getter and Setter Private String loanFlag
private List<hrCertificate> hrCertificatesList = new ArrayList<hrCertificate>();
//Getter and Setter
Private String loanFlag="";
@PostConstruct
public void init() {
this.hrCertificatesList.add(new hrCertificate(("Loan"), "LC"));
this.hrCertificatesList.add(new hrCertificate(("Health"), "HI"));
this.hrCertificatesList.add(new hrCertificate(("Trasnfer"), "TE"));
}
因此,如何应用逻辑首先,请注意,属性不会使支持它的实际属性失效,您只需要一个getter。因此,您可以:
public class MyBean implements Serializable {
private FilterEnum certFilter = FilterEnum.NO_FILTER;
private List<Certificate> certificates;
... // including certificates initialization.
public FilterEnum getCertFilter() {
return this.certFilter;
}
public void setCertFilter(FilterEnum certFilter) {
this.certFilter = certFilter;
}
public List<Certificate> getCertificates() {
// I am sure there is a cooler way to do the same with streams in Java 8
ArrayList<Certificate> returnValue = new ArrayList<>();
for (Certificate certificate : this.certificates) {
switch (this.certFilter) {
case FilterEnum.NO_FILTER:
returnValue.add(certificate);
break;
case FilterEnum.ONLY_YES:
if (certificate.isLoan) {
returnValue.add(certificate);
}
break;
case FilterEnum.ONLY_NO:
if (!certificate.isLoan) {
returnValue.add(certificate);
}
break;
}
}
return returnValue;
}
}
如果您坚持要在.xhtml中进行筛选,可以将JSTL中的c:forEach与note item(而不是items)相结合,但这会使xhtml更加复杂,如果您想使用Ajax,可能会导致问题。是否可以编辑hrCertificate类以添加禁用的布尔字段?如果是,则可以将itemDisabled={hrCerticate.disabled}添加到f:selectItems中,这应该是最简单的解决方案 另一种选择是使用地图而不是列表 .xhtml
<p:selectManyCheckbox id="hrCertificates" value="#{user.selectedHRCertificates}" layout="pageDirectio>
<f:selectItems value="#{user.hrCertificatesMap.keySet().toArray()}" var="hrCertificate" itemLabel="#{hrCertificate.hrCertificateName}" itemValue="#{hrCertificate.hrCertificateCode}" itemDisabled="#{user.hrCertificatesMap.get(hrCertificate)}" />
</p:selectManyCheckbox>
我同意你的第一个解决方案,它解决了它。谢谢
private Map<hrCertificate, Boolean> hrCertificatesMap = new HashMap<hrCertificate, Boolean>();
@PostConstruct
public void init() {
hrCertificatesMap.put(new hrCertificate(("Loan"), "LC"), null);
hrCertificatesMap.put(new hrCertificate(("Health"), "HI"), null);
hrCertificatesMap.put(new hrCertificate(("Trasnfer"), "TE"), null);
}
// Then when you're done with your SQL query, update your Map to add the corresponding boolean values...
<p:selectManyCheckbox id="hrCertificates" value="#{user.selectedHRCertificates}" layout="pageDirectio>
<f:selectItems value="#{user.hrCertificatesMap.keySet().toArray()}" var="hrCertificate" itemLabel="#{hrCertificate.hrCertificateName}" itemValue="#{hrCertificate.hrCertificateCode}" itemDisabled="#{user.hrCertificatesMap.get(hrCertificate)}" />
</p:selectManyCheckbox>