Значения уже правильно сохранены, если кнопка «Сохранить» выполняет отправку с правильным сочетанием режима выполнения / идентификатора.
Вы не указали причину, по которой изначально выбрали отправку новых значений с помощью onchange
событие, но сопутствующая проблема, та, которую новые значения пользователей иногда стирают, может быть преодолена путем объявления события со свойством refreshMode
, установленным в norefresh
.Это будет инструктировать платформу делать отправку, а не уничтожать и заново создавать поле ввода, из которого генерируется событие.Это может быть как раз то, что вы хотите, если только вы не хотите дать визуальную обратную связь для недопустимых значений, если не выполняется клиентская сторона с JavaScript перед вызовом.Я также вижу, что вы не объявляете от execMode
до partial
, таким образом отправляя серверу больше информации, чем необходимо для оценки.Не забывайте использовать его.
С учетом сказанного, это сработает и будет соответствовать вашей первоначальной идее (не обращайте внимания на другие имена и строку console.log
, которую я добавил только для целей тестирования):
<xp:repeat value="#{repeatBean.quantities}" indexVar="index">
<xp:inputText id="inputQty" value="#{repeatBean.quantities[index]}">
<xp:eventHandler event="onchange" submit="true"
execMode="partial" refreshMode="norefresh" script="console.log(Date.now())" />
</xp:inputText>
</xp:repeat>
Даже если бы вы выбрали последний подход, я не понимаю вашу озабоченность по поводу получения новых значений при вызове вашего метода сохранения.viewScope.v1
наверняка уже будет содержать все отправленные значения, нет необходимости перебирать компоненты, чтобы получить такие новые значения;они уже есть в вашем v1
Vector
.Обратите внимание на следующее (опять же, не обращайте внимания на разные имена переменных):
<xp:repeat value="#{repeatBean.quantities}" indexVar="index">
<xp:inputText id="inputQty" value="#{repeatBean.quantities[index]}" />
<br/>
</xp:repeat>
<xp:button id="button1" value="Label">
<xp:eventHandler event="onclick" submit="true"
refreshMode="partial" refreshId="showMe" action="#{repeatBean.save}" />
</xp:button>
<br/>
<xp:text id="showMe" value="#{repeatBean.quantities}" />