一个 Datatables.net table 与来自 Sharepoint 2010 REST API 的多个 ajax 调用

One Datatables.net table with multiple ajax calls from Sharepoint 2010 REST API

我是新来的,请问这个冗长的问题。我是 SP2010 的新手,到目前为止按照以下教程对我的 SP 列表进行 JQuery Ajax 调用:Who Needs a Data View Web Part? SharePoint REST and DataTables.net

我(和每个人)的问题是,SP2010 listdata.svc returns 只有 JSON 中的前 1000 个条目。然而,本教程建议一种预过滤方法来仅调用用户需要的数据,在我的例子中,我想将我所有的 200 多个条目加载到 table,然后让用户 select/filter he/she 想要什么。

我设法进行了两次 Ajax 调用(一次调用了前 1000 个条目,另一个调用了 2000 以上的其余条目 - 用于测试,以便于查看,哪一个它们进入 table),在调试器中,两个 GET 请求发出并返回状态 200-OK,数据,但只有其中一个被加载到 table.

问题:在传递给数据table之前,是否有任何方法可以组合返回的jqXHR响应,或者是否有任何设置,在table初始化,第二个数据不会覆盖第一个?我知道,对于大多数人来说,多次 ajax 调用是 "no go",但就我而言,由于我的服务器速度和 [=48= 的使用频率,这不是问题],但到目前为止,我在多次调用填充多个 table 的主题中找到了解决方案。

到目前为止我的代码:

<script type="text/javascript">
function LoadData()
{
var call = $.ajax({
            url: "https://SP2010_siteaddress.com/site/_vti_bin/listdata.svc/Listname?$select=Data1,Data2,Data3,Data4,Data5",
           type: "GET",
           dataType: "json",
           headers: {
                Accept: "application/json;odata=verbose"
            }       
        });
  
var call2 = $.ajax({
            url: "https://SP2010_siteaddress.com/site/_vti_bin/listdata.svc/Listname?$select=Data1,Data2,Data3,Data4,Data5&$skiptoken=2000",
            type: "GET",
            dataType: "json",
            headers: {
                Accept: "application/json;odata=verbose"
            }       
        });
  
 (call, call2).done(function (data,textStatus, jqXHR){
             $('#example')
     .on('xhr.dt', function ( e, settings, json ) {
     for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) {
     json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two;
     }
     // Note no return - manipulate the data directly in the JSON object.
     } )
    .dataTable({
     ajax: "data.json",
                        "bServerside" : true,
      "bProcessing": false,
      "aaData": data.d.results,
      "aoColumns": [
       { "mData": "Data1" },
       { "mData": "Data2" },
       { "mData": "Data3" },
       { "mData": "Data4" },
       { "mData": "Data5" }
       ],
       "bRetrieve": true,
    // "initComplete": function(settings, json) {
    // alert( 'DataTables has finished its initialisation.' );
    //   }
       });

   call.fail(function (jqXHR,textStatus,errorThrown){
            alert("Error retrieving Tasks: " + jqXHR.responseText);

});
});
}
</script>

提前感谢您提出任何解决此问题的建议。

如果您无法避免每次 Ajax 调用的 1000 条记录的限制,您可以使用下面的代码。

它使用 $.when 在两个 Ajax 调用都成功时执行回调。

function LoadData()
{
   var call1 = $.ajax({
      url: "https://SP2010_siteaddress.com/site/_vti_bin/listdata.svc/Listname?$select=Data1,Data2,Data3,Data4,Data5",
      type: "GET",
      dataType: "json",
      headers: {
         Accept: "application/json;odata=verbose"
      }       
   });

   var call2 = $.ajax({
      url: "https://SP2010_siteaddress.com/site/_vti_bin/listdata.svc/Listname?$select=Data1,Data2,Data3,Data4,Data5&$skiptoken=2000",
      type: "GET",
      dataType: "json",
      headers: {
         Accept: "application/json;odata=verbose"
      }       
   });

   // When both Ajax requests were successful
   $.when(call1, call2).done(function(a1, a2){
      // a1 and a2 are arguments resolved for the call1 and call2 ajax requests, respectively.
      // Each argument is an array with the following structure: [ data, statusText, jqXHR ]

      // Merge data from two Ajax calls
      var data = a1[0].d.results.concat(a2[0].d.results);

      $('#example').dataTable({
         "aaData": data,
         "aoColumns": [
            { "mData": "Data1" },
            { "mData": "Data2" },
            { "mData": "Data3" },
            { "mData": "Data4" },
            { "mData": "Data5" }
         ]
      });
   });
}