2016-07-22 7 views
0

Ich baue eine app Ionic Rahmen 7 AngularJSWarum ist mein Dienst nichts Rückkehr

$ ionic info 

Your system information: 

Cordova CLI: 6.2.0 
Gulp version: CLI version 3.9.1 
Gulp local: 
Ionic Framework Version: 1.2.4 
Ionic CLI Version: 1.7.16 
Ionic App Lib Version: 0.7.3 
OS: Distributor ID: LinuxMint Description: Linux Mint 17.1 Rebecca 
Node Version: v0.12.2 

Die Seite mit Ich baue eine Liste von Gottesdiensten abrufen und zeigt sie in einer Master-Detail-Liste. Also habe ich den $ http-Code in einem Dienst gemäß dem folgenden Code:

services.js:

.service('ServicesService', ['$http', '$sce', function($http, $sce){ 

var services = []; 

$http.get('http://demo0194057.mockable.io/services').then(function(response) { 
     services = response.data; 
     window.q = services; //checking value of services var 

}, function(error) { 
    console.error("Error loading Services Endpoint! " + error); 
}); 

return { 
    getAllServices: function() { 
     console.log('from inside return obj ' + services); 
     window.p = services; // checking value of services var 
      return services; 
    } 

} 

}]) 

controller.js:

.controller('servicesCtrl', function($scope, $http, ServicesService, InfoService) { 
$scope.services = []; 

$scope.services = ServicesService.getAllServices(); 
window.r = $scope.services; 

$scope.doRefresh = function() { 
       $http.get('http://demo0194057.mockable.io/services').success(function(response) { 
       $scope.services = response; 
      }) 
      .finally(function() { 
       // stop the ion-refresher from spinning 
       $scope.$broadcast('scroll.refreshComplete'); 
      }); 
      } 


}) 

Also mein Problem ist, dass der Service ein leeres Array anstelle eines Arrays von Objekten aus der JSON-REST-API zurückgibt. Ich habe einige Debugging-Variablen in den Code geschrieben und ich kann sehen, dass der Dienst vom Controller einen leeren Array (var window.r) zurückgibt. Aus dem Service heraus ist window.p ebenfalls leer, aber window.q hat die korrekten Objektdaten, was bedeutet, dass der API-Aufruf gut funktioniert. Ich kann jedoch nicht herausfinden, wo diese Daten verloren gehen, so dass sie nicht erfolgreich vom Dienst zurückgegeben werden. Bitte

helfen

Antwort

0

versuchen, es wie folgt aus:

Dienst

.service('ServicesService', ['$http', '$sce', function($http, $sce){ 
    var services = []; 

    return { 
     getAllServices: function() { 
      return $http.get('http://demo0194057.mockable.io/services').then(function(response) { 
        services = response.data; 
        return services; 
      }, function(error) { 
       console.error("Error loading Services Endpoint! " + error); 
      }); 
     } 

    } 
}]); 

-Controller

.controller('servicesCtrl', function($scope, $http, ServicesService, InfoService) { 
    $scope.services = []; 
    $scope.doRefresh = function() { 
     ServicesService.getAllServices().then(function (response) { 
      $scope.services = response; 
     }); 
    }); 
}); 
+0

Vielen Dank! Genau das, was ich gesucht habe! – user3086325

0

In Ihrem Service Sie die $http.get Anfrage innerhalb des Körpers getAllServices Methode tun müssen. Andernfalls wird die then-Klausel der get-Anforderung ausgeführt, nachdem der Controller getAllServices aufgerufen hat. Daher wird die services-Variable an diesem Punkt nicht initialisiert.

+0

Vielen Dank! – user3086325

0
$http.get('http://demo0194057.mockable.io/services').then(function(response) { 
     services = response.data; 
     window.q = services; //checking value of services var 

}, function(error) { 
    console.error("Error loading Services Endpoint! " + error); 
}); 

Dies ist Asynchron-Funktion. So services = response.data wird manchmal später ausgeführt.

$ scope.services = ServicesService.getAllServices(); Dies wird Anruf nur nach eckigen wird steigen und wahrscheinlich vor Ihre Async wird ausgeführt werden.

So. Wenn Sie Ihre Dienste nicht erhalten möchten, müssen Sie Ihre ServicesService.getAllServices(); als ein Versprechen, wo Sie Ihre erste Anfrage warten werden. Aber es scheint, dass es einige Architekturprobleme gibt ... Versuchen Sie, Ihren Code für eine Weile wegzudrängen und neu zu entwickeln.

+0

Vielen Dank für die Hilfe! – user3086325

+0

als bitte markieren, wenn es hilft – Vitalii

+0

okay, wie mache ich das? – user3086325