Как включить / отключить элемент в selecManyCheckbox на основе флага

Мне нужна ваша помощь в отключении и включении элемента из selectManyCheckbox компонент на странице JSF. Прежде всего, компонент selectManyCheckbox показывает три чечбокса (Loan - Health - Transfer). Список будет заполнен из 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"));    
}

В том же бине я буду выполнять оператор SQL, который будет возвращать либо Да, либо Нет, и это значение я добавляю в loanFlag variable.So, если 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>

Так как применить логику

2 ответа

Решение

Не могли бы вы отредактировать свой класс 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", вы можете объединить c:forEach из JSTL с <f:selectItem> (обратите внимание на элемент, а не на элементы), но это сделает ваш xhtml более сложным и может вызвать проблемы, если вы захотите использовать с ним Ajax.

Другие вопросы по тегам