如何在读取模式下将变量从 CSJS 传递到 SSJS

How to pass variable from CSJS to SSJS in read mode

我希望能够提示用户发表评论,然后能够通过电子邮件发送此可变评论。但是,我无法将该变量从 CSJS 传递到 SSJS。我的文档处于阅读模式。

这是一个示例按钮代码,我似乎无法通过我的评论。

有人知道怎么做吗?

提前致谢:)

<xp:panel readonly="false">
    <xp:inputHidden id="inputHidden1" value="#{viewScope.tester}">
    </xp:inputHidden>
</xp:panel>

<xp:button value="Reject" id="button7" style="margin-right:5.0px"
save="false">

<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
    <xp:this.action>
        <xp:actionGroup>

            <xp:executeScript>
                <xp:this.script><![CDATA[#{javascript:var doc:NotesDocument = currentDocument.getDocument();
doc.replaceItemValue("status", "0"); 
doc.save();
database.updateFTIndex(false);

var comment = viewScope.tester; /* HOW DO I GET COMMENT FROM CSJS TO HERE */

var ndoc = database.createDocument();
ndoc.appendItemValue("from", "tome@somewhere.com");
ndoc.appendItemValue("SendTo", "someone@somewhere.com);
ndoc.appendItemValue("subject", "My Subject");
var rti:NotesRichTextItem = ndoc.createRichTextItem("Body");
rti.appendText("Reason:" + comment + "\n\n");
ndoc.send()

}]]></xp:this.script>
            </xp:executeScript>
            <xp:openPage name="/mainpage.xsp"></xp:openPage>
        </xp:actionGroup>
    </xp:this.action>

    <xp:this.script>
        <xp:executeClientScript>
            <xp:this.script><![CDATA[
var comment = XSP.prompt("Please enter a comment:");


XSP.getElementById("#{id:inputHidden1}").value = comment;


/*
XSP.partialRefreshGet("#{id:computedField1}", 
{
params:{"para1":"1", "para2":"2"}
});

*/

]]></xp:this.script>
        </xp:executeClientScript>
    </xp:this.script>
</xp:eventHandler>
</xp:button>

不要将该字段绑定到您的文档(在阅读模式下)。将其绑定到 viewScoperequestScope 变量。

此外,请查看 here 以获取灵感。

XSP.prompt 将使用默认浏览器提示 window。您将从中获得有限的功能,并且在我看来,这不是很好的用户体验。我建议让您的拒绝按钮打开带有编辑框的 XPages 扩展库对话框以输入评论。将编辑框绑定到 requestScope 变量 - 对话框关闭后您将不需要该值,因此您需要在更高的范围级别使用它。在对话框的 "OK" 按钮中 运行 你的 SSJS 并使用 Dialog 组件的 SSJS hide() 方法关闭对话框,如果需要,在页面上添加一个组件的参数部分刷新。

过去为了实现这一点,我使用 CSS 来隐藏输入字段和按钮。客户端脚本与按钮操作分开定义。

<xp:text escape="false"><xp:this.value><![CDATA[
    <script>

    function promptBox(){
        // ... do whatever to get the data input into
        // XSP.getElementById("#{id:inputText1}").value 
        // OR if using JQuery $('.tester).val()

        // then click hidden Save button
        $('.reject').click()
        // OR
        XSP.getElementById("#{id:button1}").click()
    }
    </script>
]]></xp:this.value></xp:text>

<!-- hide the input field with CSS -->
<xp:inputText
    id="inputText1"
    value="#{viewScope.tester}"
    defaultValue="#{viewScope.tester}"
    styleClass="tester hidden">
</xp:inputText>

<!-- hide the button with CSS -->
<xp:button
    value="Reject"
    styleClass="reject hidden"
    id="button1">
<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
    <xp:this.action>
        <xp:actionGroup>

            <xp:executeScript>
                <xp:this.script><![CDATA[#{javascript:var doc:NotesDocument = currentDocument.getDocument();
doc.replaceItemValue("status", "0"); 
doc.save();
database.updateFTIndex(false);

var comment = viewScope.tester; /* scoped variable already set */

var ndoc = database.createDocument();
ndoc.appendItemValue("from", "tome@somewhere.com");
ndoc.appendItemValue("SendTo", "someone@somewhere.com);
ndoc.appendItemValue("subject", "My Subject");
var rti:NotesRichTextItem = ndoc.createRichTextItem("Body");
rti.appendText("Reason:" + comment + "\n\n");
ndoc.send()

}]]></xp:this.script>
            </xp:executeScript>
            <xp:openPage name="/mainpage.xsp"></xp:openPage>
        </xp:actionGroup>
</xp:button>

<!-- use link for button - style it with CSS -->
<a href="javascript:promptBox()"  class="btn btn-success">Reject</a>

我不喜欢将客户端和服务器端脚本都绑定到同一个按钮,代码的执行顺序不容易管理。还有其他方法可以组合这些客户端字段和服务器端脚本,但这是一个简单的演示。