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 中的错误。我试图使用
从表中获取 tbodyvar 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
jsonrpc.js -- 原生js实现 JSON-RPC 协议