Вы в основном злоупотребляете valueChangeListener
как actionListener
.Предполагается, что слушатель изменения значения имеет доступ к и старому и новому значению, прямо между отправкой нового входного значения и обновлением значения модели, так что вы можете, например, добавитьзапись в журнале об изменении значения.Вы, очевидно, не заинтересованы в старой стоимости.Вы не заинтересованы в событии изменения значения вообще.Вы заинтересованы только в новой стоимости модели.Так что вам вообще не следует использовать прослушиватель изменения значения.
Обычно вы хотите выполнять эту работу в методе прослушивателя действия.Вы можете использовать <f:ajax>
для определения слушателя действия ajax:
<h:selectOneMenu value="#{Bean.selectedItem}">
<f:selectItems value="#{Bean.itemsList}" />
<f:ajax execute="@this" listener="#{Bean.changeEvent}" render="input" />
</h:selectOneMenu>
<h:inputText id="input" value="#{Bean.selectedItem}" />
с
public void changeEvent() {
selectedItem = selectedItem;
}
Но поскольку вы связали вход с тем же свойством, что и раскрывающийся список, весьслушатель лишний.Только следующее должно сделать это для вас:
<h:selectOneMenu value="#{Bean.selectedItem}">
<f:selectItems value="#{Bean.itemsList}" />
<f:ajax execute="@this" render="input" />
</h:selectOneMenu>
<h:inputText id="input" value="#{Bean.selectedItem}" />
Проблема, с которой вы сталкиваетесь, заключается в том, что onchange="submit()"
по существу представляет форму целом , включая все другие поля ввода.Поскольку JSF обрабатывает поля ввода последовательно и вы связываете оба поля с одним и тем же свойством, значение <h:inputText>
переопределяет значение <h:selectOneMenu>
.Что касается моего комментария к вопросу, у вас не будет этой проблемы, если вы сделаете его <h:inputText readonly="true">
или <h:outputText>
(чтобы он не передавал свое значение на сервер).