我有一个带有重复控件的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中。基本上我需要掌握用户为SSJS循环中的每一行使用getComponent(“”)。getValue()输入的值。
我该怎么做。
答案 0 :(得分:1)
如果您的保存按钮使用正确的执行模式/ id组合执行提交,则已正确保存这些值。
您没有说明您最初选择使用onchange
事件提交新值的原因,而是附带问题,即用户&#39;有时会擦除新值,可以通过将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>
即使您选择后一种方法,我也不了解您在调用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}" />