【问题标题】:Xpages-Setting Up the ViewScope from client-side javaScript (oncontextmenu)Xpages-从客户端 javaScript 设置 ViewScope (oncontextmenu)
【发布时间】:2015-11-25 07:40:47
【问题描述】:

我有一个 Xpages,我可以在其中重复控制,现在我有一个视图中的文档列表。 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;">

每一行都有“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>

【问题讨论】:

  • 我曾经涉足 CSJS 和设置范围变量。也许这有帮助:github.com/zeromancer1972/CSJSScopes
  • 除非您特别想显示 UNID,否则我建议使用隐藏输入控件。我相信它会自动添加 display:none

标签: xpages contextmenu repeat view-scope


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      相关资源
      最近更新 更多