Использование события on4 a4j: support с h: selectOneMenu - PullRequest
3 голосов
/ 12 мая 2010
<h:selectOneMenu id="selectOneMenu"  value="#{Bean1.val1}" >
    <f:selectItems value="#{Bean1.selectItems}"/>
    <a4j:support event="onchange" action="#{Bean1.onSelectOneMenuChange}" reRender="textbox1 , textbox2 , textbox3, textbox4"  />
 </h:selectOneMenu>

<h:inputText id="textbox1" value="#{Bean1.textbox1}"> </h:inputText>
<h:inputText id="textbox2" value="#{Bean1.textbox2}"> </h:inputText>
<h:inputText id="textbox3" value="#{Bean1.textbox3}"> </h:inputText>
<h:inputText id="textbox4" value="#{Bean1.textbox4}"> </h:inputText>

Bean1.onSelectOneMenuChange() изменит значение Bean1.textbox1, Bean1.textbox2, Bean1.textbox3 и Bean1.textbox4 (в зависимости от выбранного значения (Bean1.val1)). Иногда он изменяет все значения текстового поля, а иногда только некоторые значения текстового поля.

Когда пользователи изменяют значение в элементе управления раскрывающегося списка «selectOneMenu», среда JSF не будет вызывать фазу обновления значений модели, а будет вызывать Bean1.onSelectOneMenuChange() напрямую. После этого все текстовые поля переопределяются. Поскольку фаза обновления значений модели не вызывается, значения, введенные пользователем, никогда не устанавливают Bean1, и исходное значение отображается в текстовом поле после reRender.

Я хочу спросить:

  1. Как вручную вызвать фазу обновления значений модели внутри Bean1.onSelectOneMenuChange()? Как я могу получить значение, введенное пользователями внутри Bean1.onSelectOneMenuChange() и установить его в соответствующие поля Bean1?

  2. Другой подход заключается в том, что только повторная визуализация тех текстовых полей, значения которых обновляются внутри Bean1.onSelectOneMenuChange (). Однако, есть много случаев. Например, значение изменит все значение текстового поля, а значения могут изменить только некоторое значение текстового поля. Как я могу reRender условно? Какой метод больше подходит для ремонтопригодности?

Обновление:

Что касается пункта 2, я обнаружил, что свойства reRender могут принимать выражение EL, поэтому я попытался использовать

 <a4j:support event="onchange"  action="#{Bean1.onSelectOneMenuChange}" reRender="#{Bean1.reRenderIDList}"  /> .

Внутри Bean1.onSelectOneMenuChange () я установил для Bean1.reRenderIDList набор идентификаторов, который требуется для повторной отправки в соответствии с требованиями бизнеса. Bean1.getRenderIDList() запускается при обновлении страницы. Однако, когда я изменяю значение <h:selectOneMenu> в пользовательском интерфейсе, Bean1.getRenderIDList () никогда не будет запускаться снова. Таким образом, текстовое поле не может быть reRender?

Есть идеи?

1 Ответ

1 голос
/ 14 мая 2010

Ваш код выглядит нормально. Нет никаких оснований для фазы обновления модели (вы не используете immediate=true). И если у вас возникла ошибка разговора / проверки, то действие никогда не было бы вызвано. Проверьте, через какие фазы вы проходите.

...