JSF selectOneMenu обновляет и возвращается к своему предыдущему состоянию, а не показывает новое значение - PullRequest
4 голосов
/ 20 января 2011

У меня есть таблица данных, в которой доступно множество элементов selectOneMenu, например, для 10 элементов, каждый из которых имеет одну комбинацию selectOneMenu.теперь, если я нажму на любую из этих комбинаций, они должны сохранить значение в базе данных и сделают это.но после сохранения измененного значения selectOneMenu возвращается в прежнее состояние.Я хочу, чтобы selectOneMenu сохранил свое текущее состояние.Кроме того, метод вызывается для каждой комбинации в таблице данных.я действительно удивляюсь почему !!я бьюсь головой последние 2 недели.Любая помощь могла бы быть полезна.заранее спасибо.

это мой первый пост здесь.это мой JSF Datatable:

<h:dataTable value="#{careNeedBean.controlledCareNeedsList}" var="careNeed"
        id="careneed_table" binding="#{careNeedBean.dataTable}">
<h:column>
 <f:facet name="header">
  <h:outputText value="NeedsLevel"/>
 </f:facet>
 <h:selectOneMenu id="needs_level_combo" style="width:200px;font-size:9px;"
                                         onchange="submit()" 
                                         valueChangeListener="#{careNeedBean.saveTaskAsessment}"
                                         binding="#{careNeedBean.selectOneMenu}">                                      
  <f:selectItem itemValue="not_assessed" itemLabel="----Not assessed----"/>
                    <f:selectItems value="#{careNeed.humanReadableNeedsList}" />
 </h:selectOneMenu>
</h:column>

Это мой код бина:

public String saveTaskAsessment(ValueChangeEvent event) {
   //does some things
   return "Success";
} 

Ответы [ 2 ]

2 голосов
/ 20 января 2011

valueChangeListener не работает только на недавно измененном компоненте. Фактически, вы используете функцию JavaScript submit() для отправки всей формы. valueChangeListener всегда будет выполняться всякий раз, когда новое выбранное значение отличается от старого значения, как было объявлено в атрибуте value.

Вы не объявили атрибут value, поэтому его значение по умолчанию равно null. Если выбранным по умолчанию элементом списка является , а не null, то будет вызван valueChangeListener.

Чтобы это исправить, вам нужно присвоить атрибут value компоненту

<h:selectOneMenu value="#{careNeed.needsLevel}">

и необходимо предварительно заполнить его таким же значением в качестве значения по умолчанию раскрывающегося списка.

this.needsLevel = "not_assessed";

Кроме того, вы также можете сделать значение по умолчанию null.

<f:selectItem itemValue="${null}" itemLabel="----Not assessed----"/>

Вне зависимости от проблемы, поскольку вы уже используете JSF 2.0, я бы предложил использовать <f:ajax> для отправки только недавно измененного раскрывающегося списка с помощью аксиальных степеней вместо использования onchange="submit()" для отправки всей формы. В конце концов, это лучше для пользователя.

<h:selectOneMenu>
    <f:ajax />
</h:selectOneMenu>

Кроме того, метод valueChangeListener не должен ничего возвращать. Это все равно будет проигнорировано. Просто объявите это void.

1 голос
/ 11 сентября 2014

Вы можете использовать AjaxSingle = "true" и onsubmit = "form.refresh ();"по вашему запросу ajax.

Так что он будет обрабатывать только текущий компонент.form.refresh ();удалит старое значение кэша.Вы получите обновленную стоимость бобов.

...