2016-09-26 63 views
0

如何从使用javascript的SharePoint中的不同列表中列出项目。鉴于我所有的列表都存储在一个数组中。我需要遍历数组并在每个列表上执行类似的功能。从多个列表中检索存储在数组中的列表项目

function initializePage() { 

listcollections.forEach(function (value, index) { // listcollections is the array that contains the list url for different lists 

    var listtitle = value.listTitle; 
    var siteUrl = value.siteURL; 


    getItemsWithCaml(siteUrl, listtitle, 
    function (camlItems) { 


     var listItemEnumerator = camlItems.getEnumerator(); 
     while (listItemEnumerator.moveNext()) { 

      var EventsItem = new Events(); 
      var listItem = listItemEnumerator.get_current(); 

      EventsItem.eventTitle = listItem.get_item('Title'); 
      EventsItem.eventDate = listItem.get_item('EventDate'); 
      EventsItem.eventId = listItem.get_id(); 
      EventsItem.eventSite = siteUrl; 
      EventsItem.eventList = listtitle; 

      EventsCollection.push(EventsItem); 


     } 
    }, 
     function (sender, args) { 
      alert('An error occurred while retrieving list items:' + args.get_message()); 
     });  
}) 

};

function getItemsWithCaml(siteUrl, listtitle, header, success, error) 

{

var hostWebContext = new SP.ClientContext(siteUrl); 

var list = hostWebContext.get_web().get_lists().getByTitle(listtitle); 

var caml = new SP.CamlQuery(); 

//Create the CAML that will return only items expiring today or later 
caml.set_viewXml("<View><Query><Where><Geq><FieldRef Name=\'Expires\'/><Value Type=\'DateTime\'><Today /></Value></Geq></Where> </Query></View>"); 
var camlItems = list.getItems(caml); 
hostWebContext.load(camlItems); 
hostWebContext.executeQueryAsync(
     function() { 

      success(camlItems); 
     }, 
     error 
    ); 

};

//需要执行某些功能格式化每个列表项

//我不能够取回在一个单一变量的所有列表项,以便能够从所有列表中显示的数据一起

回答

0

在下面的例子中,我创建了一个名为的List对象的ListDataCollection,其中包含一个属性列表这是一个对象数组。

其中每一个都包含一个Url property whit我想要获取内容的列表的URL。

然后我循环槽对象数组并调用每个Url的Sharepoint REST api。

每次通话结束:

  • 我与数据当前对象上创建数据属性由AJAX调用REST API收到 。
  • 我也更新当前对象完成属性为true。

然后我叫了一个名为功能ifAllCompleted是检查是否所有Ajax调用结束。

当收到所有数据时,我在浏览器控制台上记录了字已完成

在这一点上,你有一个对象数组。每个对象都包含一个Sharepoint列表的数据。

例如:

ListDataCollection.Lists[0].Data.d.results[0].Title 

将包含在第一列表中的名称所述第一元件的值。

如果您愿意,您可以使用JavaScript中的concat函数合并一个数组中的所有数据。

看看单词后面的4行代码已完成

希望这可以帮助!

<script> 
var ListDataCollection = { 
    Lists:[{ 
     Url:"http://Url.Of.Your.Site.Collection/_api/web/lists/getbytitle('List1')/Items", 
     Completed:false 
    },{ 
     Url:"http://Url.Of.Your.Site.Collection/_api/web/lists/getbytitle('List2')/Items", 
     Completed:false 
    },{ 
     Url:"http://Url.Of.Your.Site.Collection/_api/web/lists/getbytitle('List3')/Items", 
     Completed:false 
    }] 
}; 

function ifAllCompleted() { 
    for (var i=0;i<ListDataCollection.Lists.length;i++) { 
     if (!ListDataCollection.Lists[i].Completed) { 
      return false; 
     } 
    } 
    console.log('Completed'); 
    var arrayOfAllData = ListDataCollection.Lists[0].Data.d.results; 
    arrayOfAllData = arrayOfAllData.concat(ListDataCollection.Lists[1].Data.d.results); 
    arrayOfAllData = arrayOfAllData.concat(ListDataCollection.Lists[2].Data.d.results); 
    console.log('Total elements : ' + arrayOfAllData.length); 
} 

$(document).ready(function(){ 
    for (var x=0;x<ListDataCollection.Lists.length;x++) { 
     $.ajax({ 
      url:ListDataCollection.Lists[x].Url, 
      indexValue:x, 
      method: "GET", 
      headers: { "Accept": "application/json; odata=verbose" }, 
      success: function (data, status, xhr) { 
       ListDataCollection.Lists[this.indexValue].Data = data; 
       ListDataCollection.Lists[this.indexValue].Completed = true; 
       ifAllCompleted(); 
      }, 
      error: function (xhr, status, error) { 
       console.log('error'); 
      } 
     });  
    } 
}); 
</script> 
+0

非常感谢!我确实通过为每个列表创建不同的函数来解决我的问题,但我的代码看起来很糟糕。我会试试这个。 –

+0

我用你的方法解决了我面临的另一个问题。完美的作品!谢谢 –