2013-05-02 11 views
23

Ich versuche AngularJS zum ersten Mal. Ich erhalte JSON-Daten von einer http-get-Anfrage unter Verwendung einer Factory, aber das Objekt wird leer zurückgegeben, bevor die Ajax-Anfrage abgeschlossen ist.AngularJS Factory http gibt leer

Factory:

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

Controller:

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

Dies ist, was ich habe kommen mit. Wenn der Controller $ scope.photos einstellt, ist der Wert leer, als würde er das fotos-Array zurückgeben, bevor es mit der Ajax-Antwort gefüllt wird.

Antwort

55

sollten Sie Ihren Code modifizieren, um ein Versprechen zurückzukehren und den Wert im Controller benutzen pls sehen Dummy modifizierten Code

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

und Controller -

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

kann ich diese Methode für die Post benutzen? –

7

die $resource Mit lassen erreichen Sie, was Sie wollen, plus geben Sie viel mehr Kontrolle im Vergleich zu $http

(Vergessen Sie nicht,.als Abhängigkeit zu Ihrer App)

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(); 
    } 
}; 
+0

Was ist der Vorteil, dies im Vergleich zu @Ajay beniwal Antwort zu tun? – user1121487

+4

Bei der Verwendung von '$ resource' handelt es sich bei jedem Ihrer Fotos um AngularJs' resource' Objekte, die Methoden wie '$ save'' $ delete' enthalten, was die Verwendung von Restful api sehr erleichtert. –

26

die q Versprechen Bibliothek verwenden bedeutet, dass Ihre Erfolgsfunktion in Ihrem Dienst bleiben kann:

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); 
     }); 
    }; 
}]); 
+1

Danke dafür. Ich denke, das ist der beste Weg, dies zu tun. es hält den Controller schlank. –

+0

Danke, das ist, was ich gesucht habe. :) – Mehmood

+0

Wie können wir den Fehler behandeln? Was wäre der Wert von Artikeln bei einem Fehler? –