我有一个重复控件从viewScope矢量获取其值的XPage。
<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事件正在更新inputfield。
所以我在寻找一种方式来循环的viewScope和保存按钮将所有的行值来替代。
所以在我的保存按钮,我想循环的viewScope的值,并把它们放在一个新的Vector,我可以写文档字段。 基本上我需要使用getComponent用户照耀处的值(“”)的持有。的getValue()用于在SSJS循环每一行。
我怎样才能做到这一点。
该值如果您保存按钮执行与正确的执行模式/ 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}" />
文章来源: How to loop and get the values from all the components in a repeat when saving