2010-05-12 2 views
3
<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)). Иногда это изменяет все значения текстового поля, и иногда это изменяет только значение текстового поля.Использование a4j: OnChange событие Support с ч: selectOneMenu

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

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

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

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

Обновление:

Для точки 2, я считаю, что засавить preperties из может принимать выражение EL, поэтому я попытался использовать

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

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

Любая идея?

ответ

1

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

+0

Да, есть некоторые , которые назначают функцию java-скрипта свойствам onblur, чтобы выполнить некоторую проверку. Как я могу обходить фазу проверки для тех событий onchange? Я хочу сделать такую ​​проверку только тогда, когда пользователь заполнит все данные и нажмите кнопку отправки. Спасибо! –

+0

^^^ для тех, кто хочет ограничить отправку, попробуйте установить атрибут 'ajaxSingle' в' true' http://livedemo.exadel.com/richfaces-demo/richfaces/ajaxAttributes.jsf?c=ajaxattributes&tab=usage – Adam