使用存储在数组中的URL检索多个列表中的列表项

时间:2016-09-26 04:47:35

标签: javascript rest sharepoint-2013

如何使用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
    );

};

//需要执行某些函数来格式化每个列表项

//我无法检索单个变量中的所有列表项,以便能够一起显示所有列表中的数据

1 个答案:

答案 0 :(得分:0)

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

其中每个都包含 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>