Как зациклить и получить значения от всех компонентов в повтор при сохранении - PullRequest
0 голосов
/ 01 июня 2018

У меня XPage с повторяющимся элементом управления, который получает значения из вектора viewScope.

<xp:repeat id="repeat1" rows="100" indexVar="i" value="#{javascript:viewScope.v1}"
</xp:repeat>

Поля привязаны к вектору, как этот

<xp:inputText value="#{viewScope.v3[i]}" id="qty" style="width:80px"</xp:inputText>

enter image description here

Мне удалось правильно получить обновление, используя событие onChange в полях ввода.что-то вроде этого.

<xp:eventHandler event="onchange" submit="true" refreshMode="partial" refreshId="qty">
                                            <xp:this.action><![CDATA[#{javascript:var v3:java.util.Vector = viewScope.v3
v3.setElementAt(getComponent("qty").getValue(),i)
viewScope.v3 = v3;

    }]]></xp:this.action>
                                        </xp:eventHandler>

Проблема заключается в том, что событие onChange обновляет поле ввода, поэтому, если пользователь слишком быстро вводит введенные значения, они теряются, и ему необходимо ввести его снова.

поэтому я ищу способ зациклить viewScope и установить все значения строк в кнопке сохранения.

Итак, в моей кнопке сохранения я хочу зациклить значения в viewScope и поместить их все в новый вектор, который я могу записать в поля документа.в основном мне нужно получить значения, введенные пользователем с помощью getComponent (""). getValue () для каждой строки в цикле SSJS.

как я могу это сделать.

1 Ответ

0 голосов
/ 01 июня 2018

Значения уже правильно сохранены, если кнопка «Сохранить» выполняет отправку с правильным сочетанием режима выполнения / идентификатора.

Вы не указали причину, по которой изначально выбрали отправку новых значений с помощью 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}" />
...