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

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

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

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


person 99maas    schedule 03.07.2015    source источник


Ответы (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>
person Mathieu Castets    schedule 03.07.2015
comment
Я пошел с вашим первым решением, и оно решило его. Спасибо - person 99maas; 03.07.2015

Во-первых, обратите внимание, что свойство не удаляет фактический атрибут, поддерживающий его, вам нужен только геттер. Итак, вы можете иметь:

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> (обратите внимание на item, а не items), но это будет сделать ваш xhtml более сложным и может вызвать проблемы, если вы хотите использовать с ним Ajax.

person SJuan76    schedule 03.07.2015