Простые лица зависят от selectOneMenu и required="true"
В моем приложении у меня есть три выпадающих меню (p:selectOneMenu
), скажем, A, B, C. Среди них два зависят, скажем, B и C. При изменении значения BI я динамически загружаю значения в C. Также имеется текстовое поле. Значение текстового поля генерируется ajax, когда событие этих изменений запускается из этих трех выпадающих списков.
Вот этот HTML-файл:
<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" />
activityTypeMenu
а также activitySubTypeMenu
зависят от выбранного значения activityTypeMenu
Я заселяю activitySubTypeMenu
,
Теперь проблемы, с которыми я сталкиваюсь:
- Скажем, я выбрал "Внешний" и "Внутренний" в
activityTypeMenu
и по умолчанию "Выберите один". Если я выберу "Внешний" изactivityTypeMenu
activitySubTypeMenu
будет иметь "Проект" и "Сервис". Но тогда, если я выберу "Select One" по умолчанию,activitySubTypeMenu
все еще содержит ранее динамически заполненные значения. Это потому чтоrequired="true"
Атрибут Resisting для запуска метода бэкэнда, из которого я загружаю динамическое значение. - Я пытался установить
itemValue
из<f:selectItem itemLabel="Select One" itemValue="" />
в#{null}
а затем бэкэнд-метод срабатывает при выборе опции "Выбрать один", и я могу установить пустой списокactivitySubTypes
и таким образомactivitySubTypeMenu
получить пустым. Но в этом случаеrequired="true"
становится бессмысленным. Я имею в виду, у меня также есть кнопка сохранения и при нажатии на эту кнопку, не выбирая никакой опции (то есть выбирая "Выбрать один") изactivityTypeMenu
а такжеactivitySubTypeMenu
не бросатьValidatorException
и компоненты не получают стиль с помощью класса ошибок css Primefaces. - Также, если я не установлю
itemValue
из<f:selectItem itemLabel="Select One" itemValue="" />
в#{null}
затем при изменении выбранного значения на значение по умолчанию ("Выбрать один") не удаляетсяactivityId
p:inputText
, Если я использую#{null}
тогда я могу получить запуск метода бэкэнда, из которого я могу установить значение текстового поля пустым.
Как я могу решить эти проблемы и получить желаемый результат. Что я хочу это:
- Если для параметра установлено значение "Выбрать один", то зависимое меню будет пустым, а меню текстового поля.
- Я хочу использовать
required="true"
приписывать.
1 ответ
Вы можете использовать EL в required
приписывать. Вы можете позволить желаемое выражение оценить true
только когда нажата определенная кнопка отправки или когда передано определенное значение компонента (и, следовательно, по его идентификатору клиента, присутствующему в карте параметров запроса #{param}
).
Следующий стартовый пример должен делать то, что вам нужно.
<p:selectOneMenu binding="#{menu1}" ... required="#{not empty param[submit.clientId]}">
...
</p:selectOneMenu>
<p:selectOneMenu ... required="#{not empty param[menu1.clientId]}">
...
</p:selectOneMenu>
<p:commandButton binding="#{submit}" ... />
Таким образом, 1-е меню требуется только тогда, когда нажата основная кнопка отправки формы (и, следовательно, нет, когда слушатели событий запускаются), а 2-е меню требуется только тогда, когда 1-е меню имеет значение.