使用REST API和角度JS

时间:2016-01-10 22:59:59

标签: rest sharepoint-2013 provider sharepoint-list hosted-app

我有一个使用REST API和Angularjs从多个SharePoint 2013列表中获取数据的方案。我能够从一个SharePoint列表中成功获取数据,但我的要求是从页面加载的多个列表中获取数据。我正在使用提供商托管的应用程序从主机网络获取数据。我有2种方法可以调用2个单独的列表。 我成功地从第一个方法获得结果,但是在执行第一个方法后调用第二个方法。我有一个超时错误。好像我不能一个接一个地调用这两种方法。下面是我的代码,如果我遗漏某些内容或者有其他方法从多个SharePoint列表中获取数据,任何人都可以帮助我。

方法1:从列表1中获取数据

var query = listEndPoint + "/getbytitle('CandidateList')/items?$select=ID,FirstName,MiddleInitial,LastName,EmailAddress,PrimaryPhoneNo,ProfileImage,Address,State,Country,CurrentTitle,CurrentCompany,LastActivityModifiedBy,LastActivityModifiedDate,DeletedStatus&@target='" + hostweburl + "'";

    var getCandidates = function (query, queryCandidateNotes) 
                    {
                    alert('getRequest');
                    var scriptbase = hostweburl + "/_layouts/15/";
                    var deferred = $q.defer();
                    // Load 15hives js files and continue to the successHandler    
                    $.getScript(scriptbase + "SP.Runtime.js",
                        function () {`enter code here`
                            $.getScript(scriptbase + "SP.js",
                                function () {
                                    $.getScript(scriptbase +"SP.RequestExecutor.js",
                                         function () {
                                             var executor = new SP.RequestExecutor(appweburl);
                                             executor.executeAsync({
                                                 url: query,
                                                 method: "GET",
                                                 headers: { "Accept": "application/json; odata=verbose" },
                                                 success: successHandler,
                                                 error: errorHandler
                                             });
                                             //deferred.resolve();
                                         });
                                });
                        });

                    function successHandler(data) {
                        var jsonObject1 = JSON.parse(data.body);

                        deferred.resolve(jsonObject1);

                    }

                    function errorHandler(data, errorCode, errorMessage) {
                        alert('Error1:' + errorMessage + data.body);
                    }
                    // Get 
                    return deferred.promise;

                    //Candidate Details Ends
                };

方法2:从列表2中获取数据

    var queryCandidateNotes = listEndPoint + "/getbytitle('CandidateNotes')/items?$select=Title,CandidateId&@target='" + hostweburl + "'";

 // Get All Candidate Notes
            var getCandidateNotes = function (queryCandidateNotes) {
                alert('getCandidateNotesRequest');
                var scriptbase = hostweburl + "/_layouts/15/";
                var deferred2 = $q.defer();
                // Load 15hives js files and continue to the successHandler    
                $.getScript(scriptbase + "SP.Runtime.js",
                    function () {
                        $.getScript(scriptbase + "SP.js",
                            function () {
                                $.getScript(scriptbase + "SP.RequestExecutor.js",
                                     function () {
                                         var executor = new SP.RequestExecutor(appweburl);
                                         executor.executeAsync({
                                             url: queryCandidateNotes,
                                             method: "GET",
                                             headers: { "Accept": "application/json; odata=verbose" },
                                             success: successHandler,
                                             error: errorHandler
                                         });
                                         //deferred.resolve();
                                     });
                            });
                    });

                function successHandler(data) {
                    var jsonObject2 = JSON.parse(data.body);
                    //var results2 = jsonObject2.d.results;
                    deferred2.resolve(jsonObject2);
                    //alert('2nd success:' + jsonObject2);
                    //return jsonObject2;
                }

                function errorHandler(data, errorCode, errorMessage) {
                    alert('Error2 :' + errorMessage + data.body);
                }
                // Get 
                return deferred2.promise;

};

方法3:在方法1之后调用方法2

   var getRequest = function (query, queryCandidateNotes) {


                var deferred = $q.defer();
                $.when(getCandidates(query, queryCandidateNotes)).then(function (data) {

                    alert('Success1:' + data);

                                           $.when(getCandidateNotes(queryCandidateNotes)).then(function (data1) {
                        deferred.resolve(data);
                        alert('Success2:' + data1);
                    });
                    })
                return deferred.promise;
            };

            return {
                getRequest: getRequest

            };

        }]);
})();

1 个答案:

答案 0 :(得分:3)

findNonZero在这里不合适,利用$q.all 将多个承诺合并到一个承诺中,当所有输入承诺得到解决时解析

示例

$.when

其中app.controller('listController', function ($scope, $q, listService) { SP.SOD.executeFunc('SP.RequestExecutor.js', 'SP.RequestExecutor', function () { $q.all([listService.getListItems('Documents'), listService.getListItems('Site Pages')]).then(function (data) { $scope.documentsItems = data[0].d.results; $scope.sitePagesItems = data[1].d.results; }); }); }); 是获取列表项的服务:

listService

解决方案说明

enter image description here

<强> app.factory('listService', ['$q', function ($q) { var getListItems = function (listTitle) { var d = $q.defer(); JSRequest.EnsureSetup(); var hostweburl = decodeURIComponent(JSRequest.QueryString["SPHostUrl"]); var appweburl = decodeURIComponent(JSRequest.QueryString["SPAppWebUrl"]); var queryUrl = appweburl + "/_api/SP.AppContextSite(@target)/web/lists/getByTitle('" + listTitle + "')/items?@target='" + hostweburl + "'"; var executor = new SP.RequestExecutor(appweburl); executor.executeAsync({ url: queryUrl, method: "GET", headers: { "Accept": "application/json; odata=verbose" }, success: function(data, textStatus, xhr) { d.resolve(JSON.parse(data.body)); }, error: function(xhr, textStatus, errorThrown) { d.reject(JSON.parse(xhr.body).error); } }); return d.promise; }; return { getListItems: getListItems }; }]);

Default.aspx

<asp:Content ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server">
    <script type="text/javascript" src="../Scripts/jquery-1.9.1.min.js"></script>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>

    <SharePoint:ScriptLink Name="sp.js" runat="server" OnDemand="true" LoadAfterUI="true" Localizable="false" />
    <meta name="WebPartPageExpansion" content="full" />

    <!-- Add your CSS styles to the following file -->
    <link rel="Stylesheet" type="text/css" href="../Content/App.css" />

    <!-- Add your JavaScript to the following file -->

    <script type="text/javascript" src="../Scripts/listService.js"></script>
    <script type="text/javascript" src="../Scripts/App.js"></script>

</asp:Content>

<强> <asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server"> <div ng-app="SPApp" ng-controller="listController"> </div> </asp:Content>

App.js

<强> 'use strict'; (function() { var app = angular.module('SPApp', ['SPApp.services']); app.controller('listController', function ($scope, $q, listService) { executeOnSPLoaded(function () { $q.all([listService.getListItems('Documents'), listService.getListItems('Site Pages')]).then(function (data) { $scope.documentsItems = data[0].d.results; $scope.sitePagesItems = data[1].d.results; }); }); }); })(); function executeOnSPLoaded(loaded) { JSRequest.EnsureSetup(); var hostweburl = decodeURIComponent(JSRequest.QueryString["SPHostUrl"]); var scriptbase = hostweburl + "/_layouts/15/"; $.when( //$.getScript(scriptbase + "SP.Runtime.js"), $.getScript(scriptbase + "SP.js"), $.getScript(scriptbase + "SP.RequestExecutor.js"), $.Deferred(function (deferred) { $(deferred.resolve); }) ).done(function () { loaded(); }); }

listService.js