保存时如何循环并重复获取所有组件的值

How to loop and get the values from all the components in a repeat when saving

我有一个带有重复控件的 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>

我已经通过在输入框上使用 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 中的值,并将它们全部放入一个我可以写入文档字段的新 Vector 中。基本上我需要获取用户使用 getComponent("").getValue() 为 SSJS 循环中的每一行输入的值。

我该怎么做。

如果您的保存按钮使用正确的执行 mode/id 组合执行提交,则这些值已经正确保存。

您没有说明您最初选择使用 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}" />