使用8.5.3 UP1
当我从对话框中保存文档时,某些字段未填充。如果我从xpage中保存文档,它会保存这些字段。这是一个简单的例子来说明这个问题:
<xp:link text="Save Document By Dialog"
id="link21">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[XSP.openDialog("#{id:dialog1}");]]></xp:this.script>
</xp:eventHandler>
</xp:link>
<br/>
<xp:button value="Save By Button" id="button1">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action>
<xp:saveDocument var="document1"></xp:saveDocument>
</xp:this.action>
</xp:eventHandler>
</xp:button>
<xe:dialog id="dialog1" title="Dialog">
<br />
<b>
<xp:text escape="true" id="computedField1">
<xp:this.value><![CDATA[#{javascript:"Save this document?"}]]></xp:this.value>
</xp:text>
</b>
<br />
<br />
<xp:button value="Yes" id="button7">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.script><![CDATA[XSP.closeDialog("#{id:dialog1}");]]></xp:this.script>
<xp:this.action>
<xp:saveDocument var="document1"></xp:saveDocument>
</xp:this.action></xp:eventHandler>
</xp:button>
<xp:button value="No" id="button8">
<xp:this.onclick><![CDATA[XSP.closeDialog("#{id:dialog1}");]]></xp:this.onclick>
</xp:button>
</xe:dialog>
<br/><br/>
<xp:inputText id="TitleTX" value="#{document1.TitleTX}"></xp:inputText>
<br/><br/>
<xp:inputRichText id="inputRichText1" value="#{document1.ProcessMapsRT}">
</xp:inputRichText>
答案 0 :(得分:5)
与xe:对话框关联的DOJO进程将对话框移动到DOM中的另一个位置,这意味着它将松散跟踪文档主要部分中的数据源。如果您使用SSJS保存对话框而不是简单的操作,它可能会更好地工作。
我使用自定义控件中包含的对话框获得了最大的成功,其中数据源通过复合数据传入。这样,与数据的连接不会丢失并且仍然有效,但是,我仍然使用SSJS来保存这些情况。
/ Newbs
更新:这可能是使用Steve Pridemore在NotesIn9#42中描述的技术的时间(见xpages.tv)。
首先在您的XPage上将新事件放入包含数据源的级别。
<xp:eventHandler
id="saveEventHandler"
submit="true"
save="true"
event="calledbyid"
refreshMode="complete">
</xp:eventHandler>
接下来,让对话框中的操作使用客户端javascript调用此事件:
XSP.executeOnServer('#{id:saveEventHandler}')
“应该”这样做。我没有对它进行全面测试,但是NoteIn9中的示例可以正常工作。
/ Newbs
答案 1 :(得分:1)
您是否尝试过使用dataContexts来定义数据源?我相信dataContext是一个全局对象。
更新: dataContexts甚至dominoDocument数据源在保存文档时都有效,但问题是没有保存这些值。因此,我使用了一个viewScope变量来存储值,这就是诀窍。我不确定这对你有帮助,但是你走了,这对我有用:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xe="http://www.ibm.com/xsp/coreex">
<xp:this.data>
<xp:dominoDocument var="newDoc" formName="frmContact"></xp:dominoDocument>
</xp:this.data>
<xp:inputText id="inputText1" value="#{viewScope.firstName}"></xp:inputText>
<xp:inputText id="inputText2" value="#{viewScope.lastName}"></xp:inputText>
<xp:button value="Label" id="button1">
<xp:eventHandler event="onclick" submit="true"
refreshMode="partial" refreshId="dialog1">
<xp:this.action><![CDATA[#{javascript:getComponent("dialog1").show();}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
<xe:dialog id="dialog1">
<xp:button value="Label" id="button2">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:newDoc.replaceItemValue("fldFirstName", viewScope.firstName);
newDoc.replaceItemValue("fldLastName", viewScope.lastName);
newDoc.save();
getComponent("dialog1").hide();}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
</xe:dialog>
</xp:view>
希望这有帮助!
答案 2 :(得分:0)
确保在打开对话框之前将数据发布到服务器。我建议用SSJS语法打开这样的对话框 - getComponent(“dialog1”)。show()