我希望有人能给我一个如何实现以下目标的指针。
目前,我有:
-
JS函数:一个jQuery AJAX查询,它将从SharePoint自定义列表中获取项目。
-
JS函数:它将把列表结果放入数据表中。
-
JS函数,可以将InitatorId转换为用户的真实名称(GetDisplayName)。
function GetDisplayName(userid) { var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/web/getuserbyid(" + userid + ")"; var requestHeaders = { "accept" : "application/json;odata=verbose" }; $.ajax({ url : requestUri, contentType : "application/json;odata=verbose", headers : requestHeaders, success : GetDisplayNameSuccess, error : GetDisplayNameFail }); } function populateMyOutstandingItems() { SP.SOD.executeFunc("sp.js", "SP.ClientContext", function() { SP.SOD.executeFunc("sp.runtime.js", "SP.ClientContext", function() { var context = SP.ClientContext.get_current(); var queryUrl = "https://companyname.sharepoint.com/subsite/_api/Web/Lists/getbytitle('Read%20Requests')/GetItems"; //change the Url var camlXML = "<Query><Where><And><Eq><FieldRef Name='ReaderId' LookupId='True' /><Value Type='Integer'>" + _spPageContextInfo.userId + "</Value></Eq><Neq><FieldRef Name='Read' /><Value Type='Text'>YES</Value></Neq></And></Where></Query>" var requestData = { "query" : {"__metadata": { "type": "SP.CamlQuery" } , "ViewXml": camlXML } }; return jQuery.ajax({ url: queryUrl, type: "POST", data: JSON.stringify(requestData), headers: { "X-RequestDigest": $("#__REQUESTDIGEST").val(), "Accept": "application/json; odata=verbose", "Content-Type": "application/json; odata=verbose" }, success: onQuerySuccessMyOutstandingItems, error: onQueryErrorMyOutstandingItems }); }); }); } function onQuerySuccessMyOutstandingItems(data) { var jsonData = data.d.results console.log(jsonData) $("#resultsDivMyOutstandingItems").dataTable( { "data" : jsonData, columns: [ { data: "Document_x0020_Name" }, { data: "Document_x0020_Library_x0020_Nam" }, { data: "Request_x0020_Made_x0020_Date" }, { data: "InitatorId" }, { data: "Request_x0020_ReadBy_x0020_Date" }, ], order: [[3, "asc"]] } ); }
目前,在数据表中,我有InitatorID(即30),但我希望在表中有用户的真实姓名。
我知道需要某种类型的递归AJAX查询,但我不确定实现这一点的最佳方法是什么,我希望有人能为我指明正确的方向。
在阅读了一些关于链接请求的内容后,我尝试了下面的代码,但我想这是错误的,因为Chrome抱怨出现了"意外的结局":
var request = $.ajax({
url: queryUrl,
type: "POST",
data: JSON.stringify(requestData),
headers: {
"X-RequestDigest": $("#__REQUESTDIGEST").val(),
"Accept": "application/json; odata=verbose",
"Content-Type": "application/json; odata=verbose"
}
}),
chained = request.then(function( data ) {
return $.ajax( spPageContextInfo.webAbsoluteUrl + "/_api/web/getuserbyid(" + data.InitatorId + ")",
{ data: { user: data.Title }} )
});
chained.done(function( data ) {
console.log(data)
});
简而言之,实现我想要做的事情的最佳方式是什么?
非常感谢Glen
我不确定我是否完全理解你的要求,所以这是我对这种情况的最佳猜测(如果我错了,请纠正我)
- 进行AJAX调用以从SharePoint自定义中获取项目列表列表,但是遗憾的是,该列表中的一列具有InitatorID而不是用户名
- 为了解决这个问题,我们想进行另一个AJAX调用,该调用将获得我们刚刚检索到的一组匹配InitatorID的用户名列表
- 一旦我们有了它,我们想把数据放在dataTable中显示
在不了解详细信息的情况下,我只会进行嵌套的AJAX调用。基本上,一旦第一个调用完成,就调用第二个AJAX函数。完成该操作后,请更新dataTable。类似于:
$.ajax({
url: MY_FIRST_URL,
data: myFirstData
}).done(function (data) {
// The first call gets completed after some time and the 'done' function is called.
// here, extract the various InitatorID values, and pass them to the
// second AJAX call, so you can then get the usernames for those Ids
var initatorIds = // ... do data massaging here to get the initatorIds
// into the format you want from the 'data' variable
// passed in the done function...
$.ajax({
url: MY_SECOND_URL,
data: initatorIds
}).done(function (data2) {
// once the SECOND call is complete, populate the dataTables
var jsonData = // ... some manipulation of data and data2 results
// to get the combined output you want.
$("#resultsDivMyOutstandingItems").dataTable( {
"data" : jsonData,
columns: [
....
....
});
}).fail(function (jqXHR, textStatus) {
// do stuff if the second call fails
});
}).fail(function (jqXHR, textStatus) {
// do stuff if the first call fails
});
冒着使解决方案过于复杂的风险,我个人希望通过dataTable插件中的ajax功能将数据直接加载到表中(请在此处阅读更多信息)。但是,如果按照上面的方式进行布局可以最大限度地减少混乱,那就先这样做吧!