2016-04-20 13 views
1

Ich bin newby in angularjs Ich recherchierte im Internet, aber ich konnte keine geeignete Lösung für mein Problem finden. Ich habe einen http-Aufruf gemacht, um einige Daten vom Controller zu bekommen. Die Controller-Seite ist in Ordnung. Aber das clientseitige Versprechen wartet nicht auf Daten. Hier Codes, die ich geschrieben habe;MVC und Angularjs: Versprechen wartet nicht Daten

//service code 
angular.module("myApp").service('$myService', function ($http, $q) { 
      this.getDataArray = function() { 
       var deferred = $q.defer(); 
       $http.get('../Home/GetDataArray') 
        .success(function success(response) { 
         deferred.resolve(response); 
        }) 
        .error(function() { 
         console.log("error getting data array"); 
         deferred.reject(); 
        }); 

       return deferred.promise; 
      }; 
    } 

// controller-code 
angular.module("myApp").controller('dataController', function ($scope, $http, $myService) { 

     $scope.getDataFromService = function() { 
      $myService.getDataArray().then(function (response) { 
        $scope.dataArray = response.data; 
       }); 
     }; 
    }); 
} 

Wenn ich die getDataFromService Methode auf den ersten $ scope.dataArray nennen, ist leer, aber der zweite Anruf wird $ scope.dataArray mit Daten gefüllt. Wo ist das Problem? Danke für Hilfe.

+0

können Sie das Ergebnis des ersten HTTP-Aufrufs in fiddler/chrome dev tools überprüfen? – fikkatra

+0

Ich habe es auch überprüft, aber wenn ich den ersten Aufruf machte, ist $ scope.dataArray leer, weil Versprechen nicht warten, wie ich sagte –

+0

Ich meine nicht $ scope.data, ich meine den HTTP-Aufruf selbst. Sind Sie absolut sicher, dass die Antwort des ersten Anrufs (wie in den Chrome-Tools angezeigt) Daten enthält? – fikkatra

Antwort

0

Kein eckiger Experte mich. So habe ich es gemacht, als ich auf dasselbe Problem stieß. Versuchen Sie folgendes:

Controller:

angular.module("myApp").controller('dataController',[ '$scope', 'Service1', '$http', function ($scope, Service1, $http) { 
    var deferred = Service1.getDataArray().$promise; 
      return deferred.then(function successCallback(data, status, headers, config) { 
       // this callback will be called asynchronously 
       // when the response is available 
       $scope.dataArray = response.data; 
      }, function errorCallback(response) { 
       // called asynchronously if an error occurs 
       // or server returns response with an error status. 
      }) 
    }]) 

und Service:

var service = angular.module("myApp").service('myService', ['ngResource']); 
    myService.factory('Service1', ['$resource', 
    function ($resource) { 
     return $resource('../Home/GetDataArray', {}, { 
      get: { method: 'GET', isArray: true }, 
     }); 
    }]) 

Die Idee ist, dass Ihr Dienst nicht derjenige ist, der für eine Rückkehr warten sollte, Ihr Controller ist. Sie sollten also auf das Versprechen in Ihrem Controller warten, nicht auf Ihren Service. In meinem Beispiel verwende ich Fabriken, weil, so, wie ich es in meinem Projekt verstanden habe, Sie es direkt implementieren können, wenn Sie keine Fabrik benutzen wollen.

+0

Danke für die Hilfe, löst dieser Ansatz mein Problem. –