这是上一个问题的延续,我问last week。
我有一个XPage。在这个XPage上我有一个转发器。在这个转发器中,我有一个自定义控件,用于显示自己的数据源的内容 - 一个NotesXspDocument。该控制重复5至10次,可能重复15次。我不想让用户按下每次重复控制的保存,所以我使用上面链接问题中描述的提交按钮功能。
当用户按下提交按钮时,我在事件选项卡上使用querySaveDocument和postSaveDocument操作(我还尝试了数据选项卡中具有相同名称的属性,结果相同)。我的问题如下:
验证将在另一个控件实例之后执行,直到验证失败并立即保存数据源,然后再转到下一个实例。保存新文档时,似乎XspDocument已消失且字段已清空。我已经检查过,我已经设置了数据源范围来查看,因为这种行为在某种程度上类似于requestScope。只要我重新加载页面,就会正确显示信息。
我可以使用" context.reloadPage()"只是获取更新的信息,但这会产生令人讨厌的副作用,即删除所有未保存的信息(例如,如果在第x行上验证失败)。我怎样才能最好地解决/解决这个问题?我应该注意什么?有没有人见过这样的行为?
我想在Containing XPage的所有行上调用validate函数,然后如果所有行都成功,则调用saveDataSources函数。任何帮助是极大的赞赏!
答案 0 :(得分:1)
我真的不知道你想要做什么,所以我只是评论一件作品。 如果你想让数据在context.reloadPage()中存活,我想你需要将你的控件绑定到sessionScope。在重新加载期间,ViewScope可能已被清除,但sessionScope仍应可用。
祝你好运!
答案 1 :(得分:1)
重复控制之外的一个简单按钮就可以了。我创建了这个例子:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:repeat id="repeat1" rows="30" value="#{javascript:4}">
<xp:panel id="dataPanel" disableOutputTag="true">
<xp:this.data>
<xp:dominoDocument var="document1" formName="Demo2">
</xp:dominoDocument>
</xp:this.data>
<xp:table>
<xp:tr>
<xp:td>
<xp:label value="Subject!" id="subject_Label1" for="subject1">
</xp:label>
</xp:td>
<xp:td>
<xp:inputText value="#{document1.Subject}"
id="subject1" required="true">
<xp:this.validators>
<xp:validateRequired
message="Say something">
</xp:validateRequired>
<xp:validateLength minimum="5"
message="Say 5 characters or more">
</xp:validateLength>
</xp:this.validators>
</xp:inputText>
</xp:td>
</xp:tr>
<xp:tr>
<xp:td>
<xp:label value="Color!" id="color_Label1" for="color1">
</xp:label>
</xp:td>
<xp:td>
<xp:comboBox value="#{document1.Color}"
id="color1" defaultValue="red">
<xp:this.validators>
<xp:validateExpression
message="We don't like red">
<xp:this.expression><![CDATA[#{javascript:value != "red"}]]></xp:this.expression>
</xp:validateExpression>
</xp:this.validators>
<xp:selectItem itemLabel="red"></xp:selectItem>
<xp:selectItem itemLabel="yellow"></xp:selectItem>
<xp:selectItem itemLabel="green"></xp:selectItem>
<xp:selectItem itemLabel="blue"></xp:selectItem>
<xp:selectItem itemLabel="white"></xp:selectItem>
<xp:selectItem itemLabel="black"></xp:selectItem>
</xp:comboBox>
</xp:td>
</xp:tr>
</xp:table>
</xp:panel>
</xp:repeat>
<xp:messages layout="table" style="color:red" id="messages1">
</xp:messages>
<xp:button value="Save?" id="button1">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete" immediate="false" save="true"></xp:eventHandler>
</xp:button>
</xp:view>
除非满足所有验证,否则它不会保存任何数据,也不会删除任何输入的数据。不要试图XPages自动执行的操作(你也不要在她的皮毛上刷猫)。您的验证应该在验证器中进行,并通过按钮保存数据源。如您所见:此处不需要查询/发布事件代码。