xpages JSON-RPC 服务处理来自回调函数的响应

Posted

技术标签:

【中文标题】xpages JSON-RPC 服务处理来自回调函数的响应【英文标题】:xpages JSON-RPC Service handling response from callback funciton 【发布时间】:2014-09-02 15:10:47 【问题描述】:

我有一个 slickgrid 屏幕(在常规 Domino 表单上),用户可以在其中选择和更新一些文档。我需要显示每个选定文档的弹出窗口显示状态,因此我创建了一个 XPage。在我的 XPage 中,我遍历选定的文档数组 (json) 并为每个文档调用一个 RPC 方法。调用 RPC 方法的代码在 XPAGE 的 onClientLoad 事件上单击的按钮中。 RPC 工作正常,因为文档正在根据需要进行更新。早些时候,我有 RPC 返回的行 () 的 html 代码,该代码被附加到 HTML 表中。它适用于 Firefox,但不适用于 IE。现在我正在尝试使用 Dojo 追加行,但这也不起作用。


这是我点击按钮时的 Javascript 代码。


var reassign = window.opener.document.getElementById("ResUsera").innerHTML;
var arr = new Array();
var grid = window.opener.gGrid;
var selRows = grid.getSelectedRows();
for (k=0;k<selRows.length;k++)

    arr.push(grid.getDataItem(selRows[k]));

var tab = dojo.byId("view:_id1:resTable");
while (arr.length > 0)
   
    var fldList = new Array();
    var ukey;
    var db;
    var reqStatusArr = new Array();
    var docType;
    var docno;

    ukey = arr[0].ukey;
    db = arr[0].docdb;
    docType = arr[0].doctypeonly;
    docno = arr[0].docnum;
    fldList.push(arr[0].fldIndex);
    reqStatusArr.push(arr[0].reqstatusonly);

    arr.splice(0,1)
    for (i=0;i < arr.length && arr.length>0;i++)
    
        if ((ukey == arr[i].ukey) && (db == arr[i].docdb))
        
            fldList.push(arr[i].fldIndex);
            reqStatusArr.push(arr[i].reqstatusonly);
            arr.splice(i,1);
            i--;
        
    
    console.log(ukey+" - "+db+" - "+docno+" - "+docType);   
    var rmcall = faUpdate.updateAssignments(db,ukey,fldList,reassign); 
    rmcall.addCallback(function(response)
    
        require(["dojo/html","dojo/dom","dojo/domReady!"],function(html,dom)
        
                var tbdy = dom.byId("view:_id1:resTable").getElementsByTagName("tbody"); 
                html.set(tbdy, 
                tbdy.innerHTML+"<tr>"+
                 "<td>"+docType+"</td>"+
                 "<td>"+docno+"</td>"+
                 "<td>"+reqStatusArr.join("</br>")+"</td>"+
                 "<td>"+response+"</td></tr>"
                 );

        );
    );

dojo.byId("view:_id1:resTable").style.display="inline";
dojo.byId("idLoad").style.display="none";

RPC 服务代码


 <xe:jsonRpcService
                id="jsonRpcService2"
                serviceName="faUpdate">
                <xe:this.methods>
                    <xe:remoteMethod name="updateAssignments">
                        <xe:this.arguments>
                            <xe:remoteMethodArg
                                name="dbPth"
                                type="string">
                            </xe:remoteMethodArg>
                            <xe:remoteMethodArg
                                name="uniquekey"
                                type="string">
                            </xe:remoteMethodArg>
                            <xe:remoteMethodArg
                                name="fieldList"
                                type="list">
                            </xe:remoteMethodArg>
                            <xe:remoteMethodArg
                                name="reassignee"
                                type="string">
                            </xe:remoteMethodArg>
                        </xe:this.arguments>
                        <xe:this.script><![CDATA[print ("starting update assignments from future assignments page");
    var db:NotesDatabase = null;
    var vw:NotesView = null;
    var doc:NotesDocument = null;

    try
        db=session.getDatabase("",dbPth);
        if (null!= db)
            print(db.getFileName());
            vw = db.getView("DocUniqueKey");
            if (null!=vw)
                print ("got the view");
                doc = vw.getDocumentByKey(uniquekey);
                if (null!=doc)
                
                    //check if the document is not locked
                    if (doc.getItemValueString("DocLockUser")=="")
                    
                        print ("Got the document");

                        for (i=0;i<fieldList.length;i++)
                        
                            print (fieldList[i]);
                            doc.replaceItemValue(fieldList[i],reassignee);
                        
                        doc.save(true);
                        return "SUCCESS";
                    
                    else
                    
                        return "FAIL - document locked by "+session.createName(doc.getItemValueString("DocLockUser")).getCommon();
                    
                
                else
                
                    return "FAIL - Contact IT Deptt - Code: 0";
                
            
            else
            
                return "FAIL - Contact IT Deptt - Code: 1";
            
        
        else
        
            return "FAIL - Contact IT Deptt - Code: 2";
        

    
    catch(e)
        print ("Exception occured --> "+ e.toString());
        return "FAIL - Contact IT Deptt - Code: 3";
    
    finally
        if (null!=doc)
            doc.recycle();
            vw.recycle();
            db.recycle();
        
    ]]></xe:this.script>
                    </xe:remoteMethod>
                </xe:this.methods>
    </xe:jsonRpcService>

提前致谢

【问题讨论】:

【参考方案1】:

我已经解决了这个问题。首先,CSJS 变量在回调函数中没有可靠地设置,所以我让 RPC 返回我想要的 HTML 字符串。其次是我在 CSJS 中的错误。我试图使用

从表中获取 tbody
var tbdy = dom.byId("view:_id1:resTable").getElementsByTagName("tbody"); 

它在哪里返回一个数组,所以它应该是

var tbdy = dom.byId("view:_id1:resTable").getElementsByTagName**("tbody")[0]**; 

我也将 tbody 移到了 while 循环之上。如果有人感兴趣,我可以发布整个代码!

【讨论】:

以上是关于xpages JSON-RPC 服务处理来自回调函数的响应的主要内容,如果未能解决你的问题,请参考以下文章

如何从 json-rpc webservice 获取数据:iPad /iPhone / Objective C

如何使用 Adonis 发出 json-rpc 请求

jsonrpc.js -- 原生js实现 JSON-RPC 协议

Bitcoind JSON-RPC:Java Jersey 客户端:来自服务器错误的文件意外结束

xpages:引用来自不同数据库/应用程序的视图

Angular JSON-RPC:处理错误