根据Tim Tripcony的建议,我在下面实现了一个简单的xpage,允许我扩展no。当用户点击"添加更多"按钮。我有一个部分刷新的问题,当Add More按钮执行局部刷新并扩展no时,不记得数据。行。
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" dojoForm="true">
<xp:this.data>
<xp:dominoDocument var="newDoc" formName="frmAddMore"></xp:dominoDocument>
</xp:this.data>
<xp:this.afterPageLoad><![CDATA[#{javascript:viewScope.rowCount = new java.lang.Integer(5);}]]></xp:this.afterPageLoad>
<xp:div id="parentDiv">
<xp:repeat indexVar="fieldSuffix" value="#{viewScope.rowCount}"
rows="#{viewScope.rowCount}" var="row">
<xp:div>
<xp:inputText id="KeyNo">
<xp:this.value><![CDATA[#{newDoc["KeyNo_#{fieldSuffix}"]}]]></xp:this.value>
</xp:inputText>
<xp:inputText id="Qty">
<xp:this.value><![CDATA[#{newDoc["Quantity_#{fieldSuffix}"]}]]></xp:this.value>
</xp:inputText>
</xp:div>
</xp:repeat>
<xp:button value="Add More" id="btnAddMore"
execMode="partial">
<xp:eventHandler event="onclick" submit="true"
execMode="partial" execId="parentDiv" refreshMode="partial" refreshId="parentDiv">
<xp:this.action><![CDATA[#{javascript:viewScope.rowCount = new java.lang.Integer(viewScope.rowCount + 5);}]]></xp:this.action>
<xp:this.script>
<xp:executeClientScript
script="dojo.window.scrollIntoView(dojo.byId('#{id:btnAddMore}').id);">
</xp:executeClientScript>
</xp:this.script>
</xp:eventHandler>
</xp:button>
</xp:div>
</xp:view>
我在这里缺少什么?
我还注意到dojo.window.scrollIntoView客户端JS功能不起作用?任何帮助将不胜感激。
答案 0 :(得分:1)
在您的代码中,我无法看到数据在文档中实际保存的位置。因此,每当刷新rowdata时,它都会迭代字段并从中检索数据。由于未保存数据,因此您丢失了用户输入的数据。
向partialrefresh添加一个保存简单动作,它应该有效。如果您愿意,请禁用验证,以便仅在用户单击某种保存按钮时才进行验证。
答案 1 :(得分:1)
如果没有刷新保存数据的内容,则部分刷新不会丢失数据。 prtial刷新和完全刷新之间的唯一区别是,部分只发生在页面的一个区域,在本例中,刷新的“parentDiv”中包含所有控件,因此parentDiv将被完全重新加载。
例如,如果您在哪里部分刷新inputText“KeyNo”,则会丢失其数据但输入文本“Qty”不会,因为刷新后会触及“Qty”。