Ich möchte Daten vom Server mit Angular Factory abrufen. Hier ist was ich getan habe.

.factory('Profile',function($http){
        return {
            getProfile: function(id){
                $http.get(httpUrl + 'vendors/detail?id=' + id).then(function(result){
                    return result.data;
                });
            }
        }
    })

Und im Controller rufe ich Profile so auf

.controller('profileCtrl', function($scope,$http,Profile){
        $scope.contact = function(id){
            $scope.vendor = Profile.getProfile(id);
            console.log($scope.vendor);
        }
}

Aber ich bekomme immer undefined aus dem Protokoll. Ich erwarte json Daten, die vom Server zurückgegeben werden. Wie kann ich das richtig machen?

0
Abaij 19 Apr. 2018 im 10:40

4 Antworten

Beste Antwort

Ihre Factory-Methode getProfile () gibt nichts zurück. Die Rückgabe innerhalb von .then () des $ http.get gibt den Wert zurück, der im nächsten .then () verwendet werden soll.

Die beste Option ist, den gesamten $ http-Aufruf zurückzugeben. Wie so:

getProfile: function(id){
    return $http.get(httpUrl + 'vendors/detail?id=' + id).then(function(result){
        return result.data;
    });
}

Sie können die Rückgabe beibehalten, sodass das nächste .then () , das Sie ausführen, bereits die richtigen Parameter enthält, ohne dass "result.data" ausgeführt werden muss. Wie so:

.controller('profileCtrl', function($scope,$http,Profile){
    $scope.contact = function(id){
        Profile.getProfile(id).then(function(response) {
            $scope.vendor = response;
            console.log($scope.vendor);
        });
    }
}

Ein $ http-Aufruf gibt ein Versprechen zurück, das verkettet werden kann. Alles, was Sie innerhalb eines Versprechens zurückgeben, kann in der nächsten Kette verwendet werden. Weitere Informationen

1
Giovani Vercauteren 19 Apr. 2018 im 07:53

Das Problem bei Ihrem Ansatz ist, dass Sie das Versprechen nicht geben.

            $http.get(httpUrl + 'vendors/detail?id=' + id).then(function(result){
                return result.data;
            });

Hier ist return result.data; kein Versprechen. Wenn Sie es also im Controller verarbeiten, fehlt Ihnen die Antwort, da es sich um einen asynchronen Prozess handelt (d. H. Ihre Daten sind noch nicht vom Server eingetroffen) und Sie undefiniert werden .

Factory.js

  .factory('Profile',function($http){
    return {
        getProfile: function(id){
            return $http.get(httpUrl + 'vendors/detail?id=' + id);
        }
    }
 })

In controller.js

   .controller('profileCtrl', function($scope,$http,Profile){
    $scope.contact = function(id){
        Profile.getProfile(id).then(function(response){
           $scope.vendor = response.data;
     });
        console.log($scope.vendor);
    }
 }

ODER

Verwenden Sie diese Option, wenn Sie die Antwort vor dem Senden an den Controller bearbeiten möchten

  .factory('Profile',function($http,$q){
    return {
        getProfile: function(id){ 
            var  deferred = $q.defer();
            $http.get(httpUrl + 'vendors/detail?id=' + id).then(function(resp){ 
                // modify the "resp" and then return
                deferred.resolve(resp);
            },function( error ){
              deferred.reject(error);
          })
        }
       return deferred.promise;
    }
 })

In controller.js

   .controller('profileCtrl', function($scope,$http,Profile){
    $scope.contact = function(id){
        Profile.getProfile(id).then(function(response){
           $scope.vendor = response;
     });
        console.log($scope.vendor);
    }
 }
2
Shashank Vivek 19 Apr. 2018 im 08:28

Es gibt ein kleines Problem mit Ihrem Code. Zu dem Zeitpunkt, an dem Ihr Profile.getProfile(id) $scope.vendor initialisiert, wurde das console.log($scope.vendor); bereits ausgeführt, weshalb Sie undefined erhalten.

Was Sie tun möchten, ist console.log($scope.vendor); im then Ihrer Fabrik. Etwas wie:-

Profile.getProfile(id) 
.then(function(response){ 
   $scope.vendor = response.data.value;
   console.log($scope.vendor);
});
0
manish 19 Apr. 2018 im 07:48

Ich denke, Sie vermissen das Schließen Ihrer Klammern und vielleicht müssen Sie in Ihrem factory auch die Fabrik wie folgt aufrufen:

.controller('profileCtrl', ['$scope','$http','Profile',  
  function($scope,$http,Profile){
    $scope.contact = function(id){
        $scope.vendor = Profile.getProfile(id);
        console.log($scope.vendor);
    }
}]);

Ich hoffe das hilft

0
Nizardinho 19 Apr. 2018 im 07:51