2015-07-10 85 views
1

我是新来的,所以请提前将我用于冗长的问题。我是SP2010的新手,到目前为止,接下来的教程将JQuery Ajax调用到我的SP列表中:Who Needs a Data View Web Part? SharePoint REST and DataTables.net一个Datatables.net表与来自Sharepoint 2010的多个ajax调用REST API

我的(和每个人)的问题是,SP2010 listdata.svc只返回前1000个条目JSON。然而,本教程提出了一种预过滤方法来调用用户需要的数据,在我的情况下,我想将所有200多个条目加载到表中,然后让用户选择/过滤他/她要。

我设法做出两个Ajax调用(其中一个具有前1000个条目,另一个具有2000以上的其他 - 用于测试,以便于查看,其中哪些调入表),以及在调试器中,GET请求都会返回并返回状态200-OK,并且数据,但只有其中一个被加载到表中。

问题:是否有任何方法传递到DataTable之前返回jqXHR响应合并,或者是有任何的设置,该表初始化之后,第二个数据不会覆盖的第一个?我知道,多数Ajax调用对大多数人来说都是“不行”,但就我而言,由于服务器的速度和表的使用频率,这并不是问题,但到目前为止,我找到了解决方案多个调用来填充多个表的主题。

我迄今为止代码:

<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" 
 
      }  
 
     }); 
 
\t \t 
 
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" 
 
      }  
 
     }); 
 
\t \t 
 
(call, call2).done(function (data,textStatus, jqXHR){ 
 
      \t $('#example') 
 
\t \t \t \t \t .on('xhr.dt', function (e, settings, json) { 
 
\t \t \t \t \t for (var i=0, ien=json.aaData.length ; i<ien ; i++) { 
 
\t \t \t \t \t json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two; 
 
\t \t \t \t \t } 
 
\t \t \t \t \t // Note no return - manipulate the data directly in the JSON object. 
 
\t \t \t \t \t }) 
 
\t \t \t \t .dataTable({ 
 
\t \t \t \t \t ajax: "data.json", 
 
         \t "bServerside" : true, 
 
\t \t \t \t \t \t "bProcessing": false, 
 
\t \t \t \t \t \t "aaData": data.d.results, 
 
\t \t \t \t \t \t "aoColumns": [ 
 
\t \t \t \t \t \t \t { "mData": "Data1" }, 
 
\t \t \t \t \t \t \t { "mData": "Data2" }, 
 
\t \t \t \t \t \t \t { "mData": "Data3" }, 
 
\t \t \t \t \t \t \t { "mData": "Data4" }, 
 
\t \t \t \t \t \t \t { "mData": "Data5" } 
 
\t \t \t \t \t \t \t ], 
 
\t \t \t \t \t \t \t "bRetrieve": true, 
 
\t \t \t \t // \t "initComplete": function(settings, json) { 
 
\t \t \t \t // \t alert('DataTables has finished its initialisation.'); 
 
\t \t \t \t // \t \t \t } 
 
\t \t \t \t \t \t \t }); 
 

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

 
}); 
 
}); 
 
} 
 
</script>

在此先感谢任何建议,就如何解决这个。

回答

2

如果您无法避免每个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" } 
     ] 
     }); 
    }); 
} 
+0

谢谢,$然后是其中一个选项,我也试过了,但也许我不明白它足以让它工作并将其删除。将检查,并让你知道结果。 – Beavis

+0

谢谢你,作品像一个魅力。 – Beavis