保存时如何循环并重复获取所有组件的值
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}" />
我有一个带有重复控件的 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}" />