Пропустить проверку условно, если выбран пустой f: selectItem в p / h: selectOneMenu
Родители:
<p:selectOneMenu id="parentList"
value="#{bean.selectedParent}"
converter="#{parentConverter}"
required="true">
<f:selectItem itemLabel="Select" itemValue="#{null}"/>
<f:selectItems var="parent"
value="#{bean.parentList}"
itemLabel="#{parent.parentName}"
itemValue="#{parent}"/>
<p:ajax update="childrenList" listener="#{bean.setchildren}"/>
</p:selectOneMenu>
Дети :
<p:selectOneMenu id="childrenList"
value="#{bean.selectedchild}"
converter="#{childConverter}"
required="true">
<f:selectItem itemLabel="Select" itemValue="#{null}"/>
<f:selectItems var="child"
value="#{bean.childrenList}"
itemLabel="#{child.childName}"
itemValue="#{child}"/>
</p:selectOneMenu>
Управляемый боб:
@Named
@ViewScoped
public class Bean implements Serializable {
@Inject
private Service service;
private Parent selectedParent;
private Child selectedChild;
private List<Parent> parentList;
private List<Child> childrenList;
private static final long serialVersionUID = 1L;
public Bean() {}
@PostConstruct
private void init() {
parentList = service.getParentList();
// Not necessary unless selectedParent is already available in edit mode.
if(selectedParent != null) {
childrenList = service.getChildrenListByParent(selectedParent);
}
}
public void setChildren() {
if(selectedParent != null) {
childrenList = service.getChildrenListByParent(selectedParent);
} else {
childrenList = null;
}
}
// Getters and setters.
}
Список детей должен быть заполнен на основе их родителя, то есть список детей должен содержать только детей, связанных с конкретным родителем.
Когда первый родительский элемент в родительском списке выбран, список дочерних элементов должен быть сброшен на пустой, т. Е. Дочерние элементы не должны быть видны без их родительского элемента.
Поскольку в родительском списке есть обязательное поле проверки, оно вызывает проверку. Когда первый элемент в родительском списке выбран, дочерний список будет заблокирован для обновления из-заrequired="true"
, Технически нет ничего плохого, но существование детей без родителей может дать конечным пользователям плохой опыт.
Что должно произойти, если выбран первый элемент в родительском списке, он не должен вызывать проверку, то есть проверка должна быть пропущена условно.
Один из способов сделать это - проверитьselectedChild
или жеchildrenList
сам по себе является нулевым / пустым. Такие как,
required="#{empty selectedChild or empty childrenList}"
Но это не представляется каноническим способом условно пропустить проверку в таких случаях.
Существует ли лучший способ пропустить проверку, когда первый элемент в родительском списке выбран так, что список детей может быть очищен так же, как и родительский список (Проверка должна быть вызвана во всех других случаях. Например, когда сама форма подается либо синхронно, либо асинхронно)?