0

Ich habe diesen Service in AngularJS:

this.getProductsSiteService = function(idSite) 
{ 
    return $http.get(BASE_URL + 'obtener/productos/sitio/'+idSite); 
} 

Es funktioniert gut. Ich benutze das Verfahren unter den Dienst für das Konsumieren:

$scope.getProducts = function() 
{ 
    auth.getSiteInfo().then(function(resp) 
    { 
     auth.getProductsSiteService(resp.data.idSite).then(function(response) 
     { 
      var json = angular.fromJson(response.data.Respuesta); 
      $scope.products = json.Table; 
     }); 
    }); 
}; 

Dieser Code funktioniert gut, ich zeigen die Daten des $scope.products im HTML temnplate mit der ng-repeat Richtlinie, aber ich habe dieses Problem. Wenn ich $scope.products in einer anderen Methode des gleichen Controllers verwenden möchte, ist es immer leer. Ich rufe die $scope.getProducts() Methode und danach verwende ich console.log($scope.products) und es ist immer []. Ich habe einen Test gemacht Ich denke, es ist, weil die $scope.products innerhalb des Service ist, der .then verwendet, um das Versprechen zu lösen.

Weiß jemand, wie man dieses Problem löst? Ich muss $scope.products in anderen Methoden des Controllers verwenden.

+2

Wahrscheinlich Sie versuchen, '$ scope.products' zu Acess bevor das Versprechen gelöst. Sie könnten das Versprechen in '$ scope.getProducts' zurückgeben und' then' verwenden, um sicherzustellen, dass '$ scope.prodcuts' Daten – taguenizy

+0

hat wo rufen Sie console.log ($ scope.products) auf? Gleich nach dem Aufruf von $ scope.getProducts? – user449689

+1

Ja, ich denke, das ist das Problem, das Versprechen hat noch nicht gelöst. Danke für den Kommentar. –

Antwort

0

Lassen Sie den Service die Site-Informationen abrufen und speichern. Dann kümmere dich darum, die Produkte zu bekommen und speicher sie. Fragen Sie dann einfach nach den Produkten von den Controllern. Die Methode könnte ein Versprechen zurückgeben, sodass die Nachfrage nach den Produkten asynchron funktioniert, wenn die Produkte noch nicht angefordert wurden.

So etwas wie:

 
    this.getProductsSiteService = function() { 
     if (products) return $q.when(products); 
     //do your http request here based on previously stored site id 
     return $http.get(BASE_URL + 'obtener/productos/sitio/'+idSite).then(
     function(response) { 
      var json = angular.fromJson(response.data.Respuesta); 
      products = json.TABLE; 
      return products; 
     } 
    ) 

    }