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

时间:2017-10-31 12:41:52

标签: xpages

我希望能够提示用户发表评论,然后能够在电子邮件中发送此变量评论。但是,我无法将该变量从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>

3 个答案:

答案 0 :(得分:0)

不要将该字段绑定到您的文档(处于读取模式)。将其绑定到viewScoperequestScope变量。

另外,请here寻找灵感。

答案 1 :(得分:0)

XSP.prompt将使用默认的浏览器提示窗口。您将拥有有限的功能,在我看来,并不是一个出色的用户体验。我建议您使用拒绝按钮打开带有编辑框的XPage扩展库对话框以输入注释。将编辑框绑定到requestScope变量 - 对话框关闭后您将不需要该值,因此您需要更高的范围级别。在对话框的“确定”按钮中运行SSJS并使用Dialog组件的SSJS hide()方法关闭对话框,如果需要部分刷新,则在页面上为组件添加参数。

答案 2 :(得分:0)

为了在过去完成此操作,我使用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>

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