Родители :
<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}"
Но это не кажется каноническим способом условного пропуска проверки в таких случаях.
Существует ли лучший способ пропустить проверку, когда выбирается первый элемент в родительском списке, чтобы дочерний список мог быть очищен вместе с родительским списком (проверка должна вызывать во всех других случаях. Например, когда сама форма отправляется либо синхронно, либо асинхронно)?