0

プロジェクトの再構築に Angular 1.6.5 を使用したいのですが、ソースが一度に限られた数のレコードしか返さない場合 (リクエストごとに 1000 件返される場合)、ファクトリで $http.get リクエストを使用する方法がわかりません。 ) 取得する必要がある 2000 を超えるレコードがあります。

現在のコードでは jquery ajax を使用し、.done メソッドで値 "__next" の存在を確認し、存在する場合は、値 "__next" を渡す関数を呼び出します。「__next」値が返されない場合は、そのデータで何かを行います。

function getSpecifiedList(url){

    var specUrl = url;

    $.ajax({
        url: specUrl,
        type: "GET",
        headers:{"accept":"application/json;odata=verbose",
          error: function(xhr){
            console.log(xhr.status + " " + xhr.statusText);
          }
        }
    }).done(function (results){
        $("#wc_report_holder").text(results.length);

        //buildObjects processes the results and adds to an array
        buildObject(results);
        if(results.d.__next){
            getSpecifiedList(results.d.__next);
        }else{
            buildGridView();
        }
    }).fail(function(error){
        $("#wc_report_holder").text("There was an error: " + error);
    });
}

angular 1.6.5でベストプラクティスを使用して最も効率的に同じ値チェックと再帰呼び出しを実装する方法を理解したいのですが、角度ドキュメントとグーグルに基づいてそれを理解することができませんでした。

これは、Angular 1.6.5 を使用して現在持っているものの短いバージョンです。

<script>
var sitesApp = angular.module("sitesApp", ['ngRoute']);

sitesApp.controller('SitesListCtrl', ['$scope', 'sites',
    function ($scope, sites) {
        sites.list().then(function (response) {
            $scope.sites = response.data.value;
        });
    }
]);

sitesApp.controller("SiteDetailsCtrl", ['$scope', '$routeParams', 'sites',
    function ($scope, $routeParams, sites) {
        sites.find($routeParams.SiteCodePc, function (site) {
            $scope.site = site;
        });
    }
]);


sitesApp.config(function ($routeProvider, $locationProvider) {
    $locationProvider.hashPrefix('!');
    $routeProvider.
        when('/', {
            templateUrl: 'https://machine/sites/site-list.html',
            controller: 'SitesListCtrl'
        }).
        when('/:SiteCodePc', {
            templateUrl: 'https://machine/sites/site-details.html',
            controller: 'SiteDetailsCtrl'
        }).
        otherwise({
            redirectTo: '/'
        });
});

sitesApp.factory('sites', ['$http', function ($http) {
    var urlBase = "https://some-endpoint-for-data";
    var cachedData;

    function getData(callback) {
        if (cachedData) {
            callback(cachedData);
        } else {
            return $http({
                method: 'GET',
                url: urlBase
            })
            .then(function (response) {
                //HERE IS WHERE I THINK THE SOLUTION NEEDS TO BE IMPLEMENTED
                cachedData = response;
                return cachedData;
            });
        }
    }

    return {
        list: getData,
        find: function (SiteCodePc, callback) {
            getData(function (response) {
                var site = response.data.value.filter(function (entry) {
                    //debugger;
                    return entry.SiteCodePc === SiteCodePc;
                });
                callback(site[0]);
            });
        }
    };
}]);

</script> 

<div ng-app="sitesApp">
    <div ng-view></div>
</div>

前もって感謝します

4

2 に答える 2

1

2番目の(オプションの)パラメーターを受け入れる単純な再帰を実行できるようです。初めてgetData()を呼び出す場合は、最初の 1000 件の結果を取得できます。ただし、__next が見つかった場合は、再度呼び出して現在の 1000 件の結果を送信し、次の 1000 件の結果を前の 1000 件と連結します。

sitesApp.factory('sites', ['$http', function ($http) {
var urlBase = "https://some-endpoint-for-data";

function getData(callback, results) {
    return $http({
        method: 'GET',
        url: urlBase
    })
    .then(function (response) {
        // If you have found a previous batch of results then concat the two arrays
        if(results) {
            response = response.concat(results);
        }
        // If there are more results to be found then recursively call the same function passing the batched results
        if(response.__next) {
            return getData(callback, response);
        }
        // If there are no more results to be found then trigger your callback function
        else {
            callback(response);
        }
    });
}

return {
    list: getData,
    find: function (SiteCodePc, callback) {
        getData(function (response) {
            var site = response.data.value.filter(function (entry) {
                //debugger;
                return entry.SiteCodePc === SiteCodePc;
            });
            callback(site[0]);
        });
    }
 };
}]);
于 2017-07-28T20:01:23.783 に答える