javascript - JSON从所有网站的所有列表中动态获取两个公告

标签 javascript sharepoint sharepoint-2013

需要链接方面的帮助。功能发挥作用。但异步调用让我很难获得所有内容。帮我想想办法吧! 我的想法:

  1. 递归获取所有网站(函数有效)

  2. 从网络获取所有列表,并将公告列表添加到数组并传递

  3. 从所有公告列表中获取两项并按创建顺序排序。

  4. 将所有公告项添加到一个大数组中(以便稍后能够对数组进行排序。

这是代码,

function getAllWebs(success, error) {
    var ctx = SP.ClientContext.get_current();
    var web = ctx.get_site().get_rootWeb();
    var result = [];
    var level = 0;
    result.push(web);
    var getAllWebsInner = function (web, result, success, error) {
        level++;
        var ctx = web.get_context();
        var webs = web.get_webs();
        ctx.load(webs, 'Include(Title,Webs,ServerRelativeUrl)');
        ctx.executeQueryAsync(
          function () {
              for (var i = 0; i < webs.get_count() ; i++) {
                  var web = webs.getItemAtIndex(i);
                  result.push(web);
                  if (web.get_webs().get_count() > 0) {
                      getAllWebsInner(web, result, success, error);
                  }
              }
              level--;
              if (level == 0 && success)

                  success(result);
          },
          error);
    };

    getAllWebsInner(web, result, success, error);

}

function error(sender, args) {

    console.log(args.get_message());
};


function getAnnouncementLists(web, success, error) {
    var dfd = $.Deferred();
    var ctx = web.get_context();
    var collList = web.get_lists();
    var result = []
    ctx.load(collList, 'Include(Title, Id, BaseTemplate)');
    ctx.executeQueryAsync(function () {
        for (var i = 0; i < collList.get_count() ; i++) {
            var list = collList.getItemAtIndex(i);
            var bTemp = list.get_baseTemplate();
            if (bTemp == 104) {
                result.push(list);
            }
        }
        //success(result);
        dfd.resolve(result);
    }, error);
    return dfd.promise();
}

function getListItems(list, success, error) {

    var dfd = $.Deferred();
    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml('<View><Query><OrderBy><FieldRef Name="Created" Ascending="False"></FieldRef>'
        + '</OrderBy></Query><ViewFields><FieldRef Name="Title"/><FieldRef Name="Body"/>' +
        '<FieldRef Name="Created"/></ViewFields><RowLimit>2</RowLimit></View>');
    var listItems = list.getItems(camlQuery);
    var result = []
    var ctx = list.get_parentWeb().get_context();
    ctx.load(listItems);
    ctx.executeQueryAsync(function () {
        for (var i = 0; i < listItems.get_count() ; i++) {
            var item = listItems.getItemAtIndex(i);
            result.push(item);

        }
        dfd.resolve(result);
        //success(result);
    }, error);
    return dfd.promise();
}

function printResults(items) {

    var sortedItems = items.sort(dynamicSort("get_created()"));


    alert(sortedItems);
}

function dynamicSort(property) {
    var sortOrder = 1;
    if (property[0] === "-") {
        sortOrder = -1;
        property = property.substr(1);
    }
    return function (a, b) {
        var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
        return result * sortOrder;
    }
}

$(文档).ready(函数(){

var items = getAllWebs(
   function (allwebs) {
       var array = [];
       for (var i = 0; i < allwebs.length; i++) {
           getAnnouncementLists(allwebs[i]).then(function (announceLists) {
               for (var i = 0; i < announceLists.length; i++) {
                   getListItems(announceLists[i]).then(function (items) {
                       array.push(items);

                   });

               }
           });
       }


       return array;
   }
   );





//getAllWebs(
//    function (allwebs) {
//        for (var i = 0; i < allwebs.length; i++) {
//            getAnnouncementLists(allwebs[i],
//                function (announceLists) {
//                    for (var i = 0; i < announceLists.length; i++) {
//                        getListItems(announceLists[i],
//                            function (items) {
//                                printResults(items);


//                            }, error);
//                    }

//                }, error);
//        }
//    }, error);



});

最佳答案

考虑到从位于整个网站集的公告列表中检索列表项的要求,下面演示了包含一些改进的修改示例,例如:

  • 减少了对服务器的请求数量
  • 修复了 getAllWebs 函数中的问题,如果网站仅包含根网站,该函数会阻止返回任何结果

示例

function getAllWebs(propertiesToRetrieve,success, error) {
    var ctx = SP.ClientContext.get_current();
    var web = ctx.get_site().get_rootWeb();
    var result = [];
    var level = 0;
    ctx.load(web, propertiesToRetrieve);
    result.push(web);
    var getAllWebsInner = function (web, result, success, error) {
        level++;
        var ctx = web.get_context();
        var webs = web.get_webs();
        var includeExpr = 'Include(Webs,' + propertiesToRetrieve.join(',') + ')';
        ctx.load(webs, includeExpr);
        ctx.executeQueryAsync(
          function () {
              for (var i = 0; i < webs.get_count() ; i++) {
                  var web = webs.getItemAtIndex(i);
                  result.push(web);
                  if (web.get_webs().get_count() > 0) {
                      getAllWebsInner(web, result, success, error);
                  }
              }
              level--;
              if (level == 0 && success)
                  success(result);
          },
          error);
    };
    getAllWebsInner(web, result, success, error);
}



function loadListItems(lists,query,success,error,results){
    var results = results || [];
    var curList = lists[0];
    var ctx = curList.get_context();
    var listItems = curList.getItems(query);
    ctx.load(listItems);
    ctx.executeQueryAsync(function () {
        results.push.apply(results, listItems.get_data());
        lists.shift();
        if(lists.length > 0) {
            loadListItems(lists,query,success,error,results);
        }
        if(lists.length == 0)
           success(results);
    }, error);
}


function dynamicSort(property) {
    var sortOrder = 1;
    if (property[0] === "-") {
        sortOrder = -1;
        property = property.substr(1);
    }
    return function (a, b) {
        var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
        return result * sortOrder;
    }
}


var propertiesToRetrieve = ['Lists.Include(BaseTemplate)','ServerRelativeUrl'];
getAllWebs(propertiesToRetrieve,
function(allwebs){

    //1. get filtered lists
    var allAnnouncementLists = [];
    allwebs.forEach(function(w){
        var announcementLists = w.get_lists().get_data().filter(function(l){
            if(l.get_baseTemplate() == SP.ListTemplateType.announcements)
               return l;
        });
        allAnnouncementLists.push.apply(allAnnouncementLists, announcementLists);
    });



    //2.Load list items from lists
    var query = new SP.CamlQuery();  //<-set your custom query here
    loadListItems(allAnnouncementLists,query,
        function(allListItems){            
            //3.Sort and print results
           var sortedItems = allListItems.sort(dynamicSort("get_created()"));
           sortedItems.forEach(function(item){
              console.log(item.get_item('Title')); 
           });
        },logError);
},
logError);



function logError(sender,args){
    console.log(args.get_message());
}

关于javascript - JSON从所有网站的所有列表中动态获取两个公告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34945251/

相关文章:

javascript - node.js 中的错误处理

javascript - CKeditor 应用类在编辑器中隐藏一些图像

python - 文件更新时的 Office365-REST-Python-Client 401

javascript - 在新表单上使用 JavaScript 创建多个共享点项目,但延迟下一页加载,直到所有共享点项目都创建完成

c# - 为什么我会得到 Soap 异常?

javascript - mousemove parallax 仅轻微移动而不是鼠标位置

javascript - 检查第一个空白单元格的函数

rest - 应用不同的 RowLimit 参数时,TotalRows 属性显示不同的结果(SharePoint 2013 Search REST 和 CSOM Api)

php - PHP 中的 Sharepoint GetListItemChangesSinceToken CURL 请求

c# - 从 C# 在远程服务器上执行包含 Sharepoint 命令的 Powershell