Как включить / отключить элемент в 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.