web-dev-qa-db-fra.com

AngularJS factory http retourne vide

J'essaie AngularJS pour la première fois. J'obtiens des données JSON à partir d'une requête http-get à l'aide d'une fabrique, mais l'objet est retourné vide, avant que la requête ajax ne soit effectuée.

Usine:

myDemo.factory('photosFactory', function($http) {
    var photos = [];

    var factory = {};

    factory.getPhotos = function() {
        $http({
            url: 'content/test_data.json',
            method: 'GET'
        }).success(function(data, status, headers, config) {
            photos = data;
            return photos;
        });
    };
    return factory;
});

Manette:

controllers.AppCtrl = function($scope, $location, $http, photosFactory) {
    $scope.photos = [];
    init();
    function init() {
        $scope.photos = photosFactory.getPhotos();
    }
};

C'est ce que j'ai trouvé. Lorsque le contrôleur définit $ scope.photos, la valeur est vide comme si elle renvoyait le tableau de photos avant d'être rempli avec la réponse ajax.

23
user1121487

Vous devez modifier votre code pour renvoyer une promesse et utiliser la valeur dans le contrôleur, voir le code modifié factice

myDemo.factory('photosFactory', function($http) {
 return{
    getPhotos : function() {
        return $http({
            url: 'content/test_data.json',
            method: 'GET'
        })
    }
 }
});

et contrôleur -

controllers.AppCtrl = function($scope, $location, $http, photosFactory) {
    $scope.photos = [];
    photosFactory.getPhotos().success(function(data){
       $scope.photos=data;
   });
};
55
Ajay Beniwal

L'utilisation de la bibliothèque q promise signifie que votre fonction de réussite peut rester à votre service:

app.factory('Data', function ($http, $q) {
    return {
        ajaxItems: function () {
            var deferred = $q.defer();
            $http({ method: "POST", url: "/Home/GetSearchResults" })
                .success(function (data, status, headers, config) {
                    deferred.resolve(data);
                }).error(function (data, status, headers, config) {
                    deferred.reject(status);
                });
            return deferred.promise;
        }
    }
});

app.controller('ResultsCtrl', ['$scope', 'Data', function ($scope, Data) {
    $scope.get = function () {
        $scope.items = Data.ajaxItems();
        //the model returns a promise and THEN items
        $scope.items.then(function (items) {
            $scope.items = items;
        }, function (status) {
            console.log(status);
        });
    };
}]);
26
getsetbro

En utilisant le $resource vous permettra d'obtenir ce que vous voulez, et vous donnera beaucoup plus de contrôle par rapport à $http

(N'oubliez pas d'inclure ngResrouce comme dépendance à votre application.)

myDemo.factory('photosFactory', function($resource) {
    var factory = {};

    factory.getPhotos = $resource('content/test_data.json', {}, {
        'query': {method: 'GET', isArray: true}
    });
    return factory;
});

controllers.AppCtrl = function($scope, $location, $http, photosFactory) {
    $scope.photos = [];
    init();
    function init() {
        $scope.photos = photosFactory.getPhotos.query();
    }
};
7
Mark Coleman