【问题标题】:JSOM dynamicly get two announcements from all lists in all websJSON 从所有网站的所有列表中动态获取两个公告
【发布时间】:2018-03-27 05:57:43
【问题描述】:

在链接方面需要帮助。功能起作用。但是异步调用让我很难得到一切。帮我想想吧! 我的想法:

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

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

$(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);



});

【问题讨论】:

    标签: javascript sharepoint sharepoint-2013


    【解决方案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());
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-05
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      相关资源
      最近更新 更多