JSOM动态地从所有网站的所有列表中获得两个公告

时间:2016-01-22 11:08:01

标签: javascript sharepoint sharepoint-2013

需要链接帮助。功能有效。但异步调用让我很难获得所有东西。帮我思考吧! 我的想法:

  1. 递归获取所有网页(功能正常)

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

  3. 从所有宣布列表中获取两个项目并按创建排序。

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

  5. 继承代码,

    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;
        }
    }
    

    $(document).ready(function(){

    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);
    
    
    
    });
    

1 个答案:

答案 0 :(得分:1)

鉴于要求从网站集中的Announcements列表中检索列表项的要求,下面将演示包含一些改进的修改示例,例如:

  • 减少了对服务器的请求数
  • 修复了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());
}