Xpages-从客户端javaScript设置ViewScope(oncontextmenu)

时间:2015-11-25 07:40:48

标签: xpages contextmenu repeat view-scope

我有一个Xpages,我可以在其中重复控制,现在我有一个视图中的文档列表。在该行上单击是使用Unid设置viewScope数组。

我这样做是为了选择文档并跟踪选择哪个文档,我成功地做了这个,但主要目的是,我想在右键单击上下文菜单中获取UNID。

现在,右键单击事件也在一个文本字段中为我提供了UNID。我通过在div标签中使用“oncontextmenu”属性获得了这个。

<div oncontextmenu="javascript:
var a = document.getElementById('#{id:inputText1}').value;
document.getElementById('#{id:inputText2}').value=a;
return false;">

每行中都有“inputText1”,其特定行的默认值为UNID。

在上面的代码中,我从“inputText1”获取UNID并将其设置为“inputText2”,因此在右键单击时,我成功获取了所单击行的UNID。

在进一步的情况下,我有一个想法,我可以通过使用该UNID进行任何操作,但不是将UNID设置为“inputText2”,我想将此UNID设置为viewScope而不是“inputText2”。

基本上我的整体问题是我想使用上面的客户端java脚本将右键单击(oncontextmenu)上的UNID设置为viewScope而不是任何文本字段(“inputText2”)。

示例代码:

 <?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.afterPageLoad><![CDATA[#{javascript:var myList = new java.util.ArrayList();
sessionScope.put("myList",myList);}]]></xp:this.afterPageLoad>


    <xp:button value="Refresh" id="button3">
        <xp:eventHandler event="onclick" submit="true"
            refreshMode="partial" refreshId="repeat2">
        </xp:eventHandler></xp:button>
        <xp:repeat id="repeat2" rows="30" value="#{sessionScope.myList}"
            var="listData">
            <xp:text escape="true" id="computedField1">

                <xp:this.value><![CDATA[#{javascript:listData+" , "}]]></xp:this.value>
            </xp:text>
        </xp:repeat>
        <xp:inputText id="inputText2"></xp:inputText>
        <xp:repeat id="repeat1" rows="30" var="rowData"
        indexVar="repeatIndex" first="0" styleClass="abc">
        <xp:this.value><![CDATA[#{javascript:var viewName = "Adressakten";
var v:NotesView = database.getView(viewName);
return v.getAllEntries();}]]></xp:this.value>
        <xp:br></xp:br>

<div oncontextmenu="javascript:
var a = document.getElementById('#{id:inputText1}').value;
document.getElementById('#{id:inputText2}').value=a;
return false;">
    <xp:inputHidden id="inputText1">
        <xp:this.defaultValue><![CDATA[#{javascript:var doc:NotesDocument = rowData.getDocument();
return doc.getUniversalID();}]]></xp:this.defaultValue>
    </xp:inputHidden>
    <xp:div id="div1">
            <xp:this.style><![CDATA[#{javascript:javascript:var keyCode =  rowData.getDocument().getUniversalID();

var myArray = sessionScope.get("myList");

if(myArray.contains(keyCode))
return "border-color:rgb(192,192,192);border-style:solid;border-width:thin;height:42.0px;background-color:green;cursor:pointer;"
else
return "border-color:rgb(192,192,192);border-style:solid;border-width:thin;height:42.0px;background-color:rgb(255,255,128);cursor:pointer;"}]]></xp:this.style>
            <xp:text escape="true" id="computedField2">

                <xp:this.value><![CDATA[#{javascript:var doc:NotesDocument = rowData.getDocument();
return doc.getItemValueString('aTitel');}]]></xp:this.value>
            </xp:text>

            <br />
            document Id:
            <xp:text escape="true" id="computedField3">

                <xp:this.value><![CDATA[#{javascript:var doc:NotesDocument = rowData.getDocument();
return doc.getUniversalID();}]]></xp:this.value>
            </xp:text>
            <xp:br></xp:br>
            <xp:button value="Add" id="button1" rendered="false">
                <xp:eventHandler event="onclick" submit="true"
                    refreshMode="partial" refreshId="computedField2">
                    <xp:this.action><![CDATA[#{javascript:var keyCode =  rowData.getDocument().getUniversalID();

var myArray = sessionScope.get("myList");

if(!myArray.contains(keyCode)){
myArray.add(keyCode);
}}]]></xp:this.action>
                </xp:eventHandler>
            </xp:button>
            <xp:button value="Remove" id="button2" rendered="false">
                <xp:eventHandler event="onclick" submit="true"
                    refreshMode="complete">
                    <xp:this.action><![CDATA[#{javascript:var keyCode =  rowData.getDocument().getUniversalID();

var myArray = sessionScope.get("myList");

myArray.remove(keyCode)}]]></xp:this.action>
                </xp:eventHandler>
            </xp:button>
            <xp:eventHandler event="onclick" submit="true"
                refreshMode="complete">
                <xp:this.action><![CDATA[#{javascript:var keyCode =  rowData.getDocument().getUniversalID();

var myArray = sessionScope.get("myList");

if(!myArray.contains(keyCode)){
myArray.add(keyCode);
}
else{
myArray.remove(keyCode);
}}]]></xp:this.action>
            </xp:eventHandler>
        </xp:div></div>
        <br />
    </xp:repeat>
  </xp:view>

2 个答案:

答案 0 :(得分:1)

听起来扩展库中的JSON RPC服务就是您所需要的。这将允许您使用从CSJS传递的值来运行SSJS。它已在XPages Extension Library一书的第351-3页上介绍,扩展库演示数据库中可能有示例。

答案 1 :(得分:0)

我完全赞同 Paul Stephen Withers 的答案,最好的方法是使用JSON RPC。

这是一个JSON RPC工作示例:

<?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">

    <xe:jsonRpcService id="jsonRpcService1" serviceName="rpcService">
        <xe:this.methods>
            <xe:remoteMethod name="setUniqueID" script="sessionScope.put('sessionScopeVarTest', unid);">
                <xe:this.arguments>
                    <xe:remoteMethodArg name="unid" type="string"></xe:remoteMethodArg>
                </xe:this.arguments>
            </xe:remoteMethod>
        </xe:this.methods>
    </xe:jsonRpcService>

    Show Value of "sessionScope.sessionScopeVarTest" ->
    <xp:text escape="true" value="#{sessionScope.sessionScopeVarTest}" style="font-weight:bold">
    </xp:text>

    <br/>
    <br/>

    <xp:button id="btnTriggerRPC" value="Trigger RPC Method">
        <xp:eventHandler event="onclick" submit="false">
            <xp:this.script><![CDATA[rpcService.setUniqueID('13F51C65D8C257FCC1257ED000361786')]]></xp:this.script>
        </xp:eventHandler>
    </xp:button>
    <xp:button id="btnRefresh" value="Refresh Page">
        <xp:eventHandler event="onclick" submit="true" refreshMode="complete">
        </xp:eventHandler>
    </xp:button>

</xp:view>