繁体   English   中英

如何基于标志启用/禁用selecManyCheckbox中的项目

[英]How to enable/disable item in selecManyCheckbox based on flag

在禁用和启用jsf页面中的selectManyCheckbox组件中的项目时,我需要您的帮助。 首先,selectManyCheckbox组件显示三个复选框(贷款-健康-转移)。 该列表将从具有代码的Bean中填充:

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"));    
}

在同一个bean中,我将运行一个SQL语句,该语句将返回Yes或No,并将该值添加到loanFlag变量中。因此,如果flag =“ Y”,则需要启用贷款复选框,以便用户可以选择它,否则我需要从selectManyCheckbox禁用它。 问题是我在应用逻辑来禁用和启用selectManyCheckbox项时遇到困难,我在上面的代码中列出并始终启用它们。

selectManyChexkbox的代码:

 <p:selectManyCheckbox id="hrCertificates" value="#{user.selectedHRCertificates}" layout="pageDirectio>
     <f:selectItems value="#{user.hrCertificatesList}" 
         var="hrCertificate" itemLabel="#{hrCertificate.hrCertificateName}"
         itemValue="#{hrCertificate.hrCertificateCode}"/>

 </p:selectManyCheckbox>

那么如何运用逻辑

您可以编辑hrCertificate类以添加disabled布尔字段吗? 如果是,则可以将itemDisabled="#{hrCerticate.disabled}"到您的f:selectItems ,这应该是最简单的解决方案。

另一种选择是使用Map<hrCertificate, Boolean>代替List<hrCertificate>

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...

.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>

首先,请注意,一个属性不会取消支持它的实际属性,您只需要一个吸气剂即可。 因此,您可以:

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<f:selectItem> (请注意item ,而不是items )结合使用,但这会使您的xhtml更加复杂,并可能导致问题,如果您想与它一起使用Ajax。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM