Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何基于标志启用/禁用selecManyCheckbox中的项目_List_Jsf_Primefaces_Selectmanycheckbox - Fatal编程技术网

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

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

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

因此,如何应用逻辑首先,请注意,属性不会使支持它的实际属性失效,您只需要一个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>