Вам нужен пользовательский Validator
, который выбрасывает ValidatorException
, когда флажок содержит слишком много отмеченных элементов. Этот Validator
должен быть присоединен к компоненту флажка, и где-то в представлении должен быть компонент <h:message>
или <h:messages>
, который может отображать ошибку проверки.
Событие ajax неверно. Внутри выпадающего списка вы бы хотели подключить событие change
. Внутри флажка или переключателя вы хотели бы вместо этого подключить событие click
. И то, и другое уже установлено по умолчанию, если оставить атрибут event
по умолчанию. Каждый компонент, в свою очередь, должен ajax-представить себя и другого и, наконец, повторно обработать компонент сообщения, чтобы отразить ошибку проверки.
Чтобы отобразить выбранное раскрывающееся значение в пользовательском валидаторе, самым чистым способом было бы установить весь раскрывающийся компонент в качестве настраиваемого атрибута компонента-флажка. Этого можно достичь, привязав раскрывающийся список к представлению с помощью атрибута binding
и указав его в качестве значения <f:attribute>
внутри флажка. Компонент раскрывающегося списка и, следовательно, также его значение могут быть получены внутри пользовательского валидатора.
Подводя итог, приведенный ниже пример запуска должен работать (обратите внимание, что я использовал <f:ajax>
, поскольку <p:ajax>
не добавляет никаких дополнительных преимуществ в данном конкретном случае, и я по общему признанию не могу сказать из головы, как и если это будет работать):
<h:selectOneMenu id="chartType" binding="#{chartType}" value="#{bean.chartType}">
<f:selectItem itemValue="PieChart" itemLabel="PieChart" />
<f:selectItem itemValue="BarChart" itemLabel="BarChart" />
<f:ajax execute="chartType checkbox" render="checkboxmessage" />
</h:selectOneMenu>
<h:selectManyCheckbox id="checkbox" value="#{bean.selectedItemscheckbox}">
<f:selectItem itemValue="priority" itemLabel="By priority" />
<f:selectItem itemValue="project" itemLabel="By project" />
<f:selectItem itemValue="issuetype" itemLabel="By IssueType" />
<f:selectItem itemValue="group" itemLabel="By group" />
<f:validator validatorId="myCheckboxValidator" />
<f:attribute name="chartType" value="#{chartType}" />
<f:ajax execute="chartType checkbox" render="checkboxmessage" />
</h:selectManyCheckbox>
<h:message id="checkboxmessage" for="checkbox" />
С
@FacesValidator("myCheckboxValidator")
public class MyCheckboxValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
UIInput chartTypeComponent = (UIInput) component.getAttributes().get("chartType");
String chartType = (String) chartTypeComponent.getValue();
List<String> selectedItemscheckbox = (List<String>) value;
if ("PieChart".equals(chartType) && selectedItemscheckbox.size() > 1) {
throw new ValidatorException(new FacesMessage("Max 1 item allowed"));
}
else if ("BarChart".equals(chartType) && selectedItemscheckbox.size() > 2) {
throw new ValidatorException(new FacesMessage("Max 2 items allowed"));
}
}
}
Обратите внимание, что я принимаю #{bean.selectedItemscheckbox}
как List<String>
. Если это на самом деле a String[]
, то вам необходимо соответствующим образом изменить код валидатора.