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

Xpages从客户端javaScript设置ViewScope(oncontextmenu),xpages,contextmenu,repeat,view-scope,Xpages,Contextmenu,Repeat,View Scope,我有一个Xpages,其中有repeat控件,现在我有了视图中的文档列表。行上的Onclick正在使用Unid设置viewScope数组 我这样做实际上是为了选择文档并跟踪所选的文档,我成功地做到了这一点,但主要目的是,我想在右键单击上下文菜单上获得UNID 现在,右键单击事件还在一个文本字段中为我提供UNID。我是通过在div标记中使用“oncontextmenu”属性获得的 <div oncontextmenu="javascript: var a = document.getElem

我有一个Xpages,其中有repeat控件,现在我有了视图中的文档列表。行上的Onclick正在使用Unid设置viewScope数组

我这样做实际上是为了选择文档并跟踪所选的文档,我成功地做到了这一点,但主要目的是,我想在右键单击上下文菜单上获得UNID

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

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

每行中都有“InputExt1”,其默认值为相应行的UNID

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

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

基本上,我的总体问题是,我想使用上面的客户端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>


文档Id:

听起来您需要扩展库中的JSON RPC服务。这将允许您使用从CSJS传递的值运行SSJS。XPages扩展库手册的351-3页介绍了这一点,扩展库演示数据库中可能有一些示例。

我完全同意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>

显示“sessionScope.sessionScopeVarTest”的值“->



我曾经涉猎过CSJS和设置范围变量。也许这会有帮助:除非您特别想显示UNID,否则我建议使用隐藏输入控件。我相信它会自动添加显示:无