2016-01-22 28 views
1

需要链接帮助。功能起作用。但异步调用让我很难得到一切。帮我想一想! 我的想法:JSOM从所有网页的所有列表中动态获取两条公告

  1. 获取所有站点递归(函数工作)

  2. 从网获取的所有列表和IFF announcementlist添加到阵列,并通过沿

  3. 获取所有announcmentlists两项产品按创建排序。

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

$(文件)。就绪(函数() {

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

鉴于要求检索位于整个站点的列表项目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()); 
} 
+1

瓦迪姆。你太棒了。谢谢! – simon

相关问题