Podstawy zależą od selectOneMenu i required = „true”
W mojej aplikacji mam trzy rozwijane menu (p:selectOneMenu
), powiedzmy A, B, C. Wśród nich dwa są zależne, powiedzmy B i C. Zmieniając wartość B, dynamicznie ładuję wartości do C. Jest też pole tekstowe. Wartość pola tekstowego jest generowana przez ajax, gdy zdarzenie on-change rozpoczyna się od tych trzech list rozwijanych.
Oto xhtml:
<p:selectOneMenu id="customerMenu" value="#{adminController.activityDTO.customerId}" required="true" label="Customer Name" style="width: 200px">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{adminController.customers}" var="customer" itemLabel="#{customer.customerName}" itemValue="#{customer.customerId}" />
<p:ajax listener="#{adminController.generateActivityName}" update="activityId" />
</p:selectOneMenu>
<p:selectOneMenu id="activityTypeMenu" value="#{adminController.activityDTO.activityParentType}" required="true" label="Activity Type"
style="width: 200px">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{adminController.activityTypes}" var="activityType" itemLabel="#{activityType.parent}" itemValue="#{activityType.parent}" />
<p:ajax listener="#{adminController.updateDependentActivity}" update="activitySubType" />
</p:selectOneMenu>
<p:selectOneMenu id="activitySubTypeMenu" value="#{adminController.activityDTO.activitySubType}" required="true" label="Activity Sub Type"
style="width: 200px">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{adminController.activitySubTypes}" var="activityType" itemLabel="#{activityType.name}" itemValue="#{activityType.id}" />
<p:ajax listener="#{adminController.generateActivityId}" update="activityId" />
</p:selectOneMenu>
<p:inputText id="activityId" autocomplete="off" readonly="true" value="#{adminController.activityDTO.activityId}"
label="#{adbBundle['admin.addActivityPanel.addActivityTable.activityId']}" required="true" />
TheactivityTypeMenu
iactivitySubTypeMenu
są zależne od wybranej wartościactivityTypeMenu
PopełniamactivitySubTypeMenu
.
Teraz problemy, przed którymi stoję, to:
Powiedz, że wybrałem „Zewnętrzne” i „Wewnętrzne”activityTypeMenu
i domyślnie „Wybierz jeden”. Jeśli wybiorę „Zewnętrzny” zactivityTypeMenu
activitySubTypeMenu
będzie mieć „Projekt” i „Usługa”. Ale jeśli wybiorę domyślny „Wybierz jeden”activitySubTypeMenu
wciąż trzyma wcześniej dynamicznie wypełnione wartości. To dlatego, żerequired="true"
atrybut oporny na odpalenie metody backend, z której ładuję wartość dynamiczną.Próbowałem ustawićitemValue
z<f:selectItem itemLabel="Select One" itemValue="" />
do#{null}
a następnie metoda zaplecza uruchamia się po wybraniu opcji „Wybierz jedną” i mogę ustawić pustą listę naactivitySubTypes
i w ten sposóbactivitySubTypeMenu
stać się pustym. Ale w tym przypadkurequired="true"
robi się bez znaczenia. Mam na myśli także przycisk Zapisz i po kliknięciu tego przycisku bez wybrania jakiejkolwiek opcji (czyli wybranie „Wybierz jeden”) zactivityTypeMenu
iactivitySubTypeMenu
nie rzucaćValidatorException
a komponenty nie są stylizowane przez klasę błędów css Primefaces.Także jeśli nie ustawięitemValue
z<f:selectItem itemLabel="Select One" itemValue="" />
do#{null}
następnie przy zmianie na wybraną wartość na opcję domyślną („Wybierz jedną”) nie usuwa sięactivityId
p:inputText
. Jeśli używam#{null}
wtedy mogę uzyskać odpalanie metody backend, z której mogę ustawić wartość pola tekstowego na pustą.Jak rozwiązać ten problem i uzyskać pożądany rezultat. Chcę:
Jeśli opcja jest ustawiona na „Wybierz jedną”, to zależne menu będzie puste i menu pola tekstowego.Chcę użyćrequired="true"
atrybut.