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

时间:2018-06-01 07:24:34

标签: xpages xpages-ssjs view-scope

我有一个带有重复控件的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中的值,并将它们全部放在我可以写入文档字段的新Vector中。基本上我需要掌握用户为SSJS循环中的每一行使用getComponent(“”)。getValue()输入的值。

我该怎么做。

1 个答案:

答案 0 :(得分:1)

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

您没有说明您最初选择使用onchange事件提交新值的原因,而是附带问题,即用户&#39;有时会擦除新值,可以通过将refreshMode属性设置为norefresh来声明事件来克服。这将指示框架执行提交,而不是销毁并重新创建生成事件的输入字段。它可能正是您想要的,除非您想要为无效值提供视觉反馈,如果在调用之前没有使用JavaScript执行客户端。我还可以看到您没有声明execModepartial,因此发送的内容超出了服务器的评估范围。记得要用它。

说完之后,这将有效并尊重您最初的想法(不要介意我为测试目的添加的不同名称和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>

即使您选择后一种方法,我也不了解您在调用save方法时获取新值的担忧。 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}" />