2015-07-03 2 views
1

Мне нужна ваша помощь в отключении и включении элемента из компонента selectManyCheckbox на странице jsf. Прежде всего, компонент selectManyCheckbox показывает три chechboxes (Loan - Health - Transfer). Список будет заполняться из бобов, которые он имеет код:Как включить/отключить элемент в selecManyCheckbox на основе флага

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, если флаг = "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> 

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

ответ

0

Не могли бы вы отредактировать свой класс 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> 
+0

Я пошел с вашим первым решением и решил. благодаря – 99maas

-1

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

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 с ним.

+0

Спасибо за помощь. – 99maas

Смежные вопросы