带有代理程序runWithDocumentContext的NotesXSPDocument

时间:2014-02-28 09:51:30

标签: xpages xpages-ssjs lotus-notes

当我尝试将NotesXSPDocument传递给具有runWithDocumentContext的代理来操作某些字段时,我从未将新值传递给前端字段。我尝试过fullrefresh和partialrefresh。当我打印字段值时,我成功地获得了更改。

以下是XPage的示例

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:panel id="thePanel">
        <xp:this.data>
            <xp:dominoDocument var="document" formName="from"></xp:dominoDocument>
        </xp:this.data>
        <xp:button value="Label" id="button1">
            <xp:eventHandler event="onclick" submit="true"
                refreshMode="partial" refreshId="thePanel">
                <xp:this.action><![CDATA[#{javascript:
var agent = database.getAgent("test");
agent.runWithDocumentContext( document.getDocument());
print( "Value-->" +  document.getDocument().getItemValueString("InMemReturn"));}]]>
                </xp:this.action>
            </xp:eventHandler>
        </xp:button>

        <xp:br></xp:br>
        <xp:br></xp:br>
        <xp:inputText id="inputText1" value="#{document.InMemReturn}"></xp:inputText>
    </xp:panel>

</xp:view>

这是代理

Option Public
Option Declare


Sub Initialize

 Dim session As New NotesSession
 Dim doc As NotesDocument

 Set doc = session.Documentcontext
 doc.Appenditemvalue "InMemReturn", CStr(Now)

End Sub

我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

在绑定到输入字段的代理中处理文档很棘手。 XPage运行时并不真正了解代理正在做什么。通常,您最好将代理转换为Java bean并调用该bean。它使您有机会清理代码并优化性能。它还消除了为操作加载代理运行时的性能损失。 &#34;我想重用现有代码&#34;在这里经常被高估...

但你问......所以我们走了。文档建议您可以使用

agent.runWithDocumentContext(document.getDocument(true));

确保应用后端更改。尝试一下,让我们知道它是怎么回事。我实际上会采用稍微不同的方法并将输入字段绑定到视图变量,并仅将其写入保存事件。类似的东西:

 <xp:inputText id="inputText1" value="#{viewScope.InMemReturn}"></xp:inputText>

在您的SSJS中:

     var agent = database.getAgent("test");
     var doc = document.getDocument(true);
     agent.runWithDocumentContext(doc);
     viewScope.InMemReturn = doc.getItemValueString("InMemReturn");

并在querySave事件中:

     document.getDocument().replaceItemValue("InMemReturn",viewScope.InMemReturn);

让我们知道它是怎么回事。

答案 1 :(得分:-1)

您不在论坛中保存文件

     Call Doc.save(false,true,false)