2016-06-04 5 views
1

Ich habe einen Dienst, den ich über $http Daten erhalten möchte (der Grund für einen Dienst ist, weil ich diesen Aufruf mehrmals in meiner App machen muss)

der Service war super funktioniert, das ist der Code:

factory('websiteService', function($rootScope, $http) { 

    this.getWebsites = function(){ 
     http({ 
      method: 'GET', 
      url: './data/websites.json' 
     }).then(function successCallback(response) { 
      return response.data; 
     }); 
    } 
    $rootScope.websiteService = this; 
    return this; 
}); 

Dann verwende ich es in mehreren Steuerungen wie so:

.controller('MyCtrl', function($scope, websiteService) { 
    $scope.websites = websiteService.getWebsites(); // not working 
}); 

Obwohl, wie man dies tut, denke nicht Arbeit. Es scheint, dass websites definiert ist, bevor die $http Anfrage endet, aber ich könnte falsch liegen.

Wie kann ich das umgehen?

+2

Lesen Sie die Dokumentation zum Erstellen von Diensten mit einer Factory: Sie sollten 'this' nicht verwenden und den root-Bereich nicht ändern. Dann lesen Sie http://blog.ninja-squad.com/2015/05/28/angularjs-promises/, um die Falle über die Versprechungen zu verstehen, in die Sie geraten sind und wie Sie sie beheben können. –

+0

Danke, schau dir das an! – user3800799

Antwort

3

Hier ist, wie der Dienst definiert werden soll:

myModule.factory('websiteService', function($http) { 

    function getWebsites() { 
     return $http({ 
      method: 'GET', 
      url: './data/websites.json' 
     }).then(function successCallback(response) { 
      return response.data; 
     }); 
    } 

    return { 
     getWebsites: getWebsites 
    }; 
}); 

Und hier ist, wie es verwendet werden soll:

myModule.controller('MyCtrl', function($scope, websiteService) { 
    websiteService.getWebsites().then(function(webSites) { 
     $scope.webSites = webSites; 
    }); 
}); 

Ich schlage vor, Sie Traps, anti-patterns and tips about AngularJS promises lesen, die Fehler verstehen Sie Versprechungen gemacht.

+1

Ich habe so viel aus einer Antwort gelernt, so ein toller Artikel. ich danke dir sehr. FYI - kleiner Tippfehler in Zeile 3 'Funktion getWebsites() {' – user3800799

+1

Behoben der Tippfehler. Vielen Dank. –

+0

Ich möchte meinen Code verbessern, also speichere ich die HTTP-Antwort auf den lokalen Speicher des Benutzers, aber sobald er erstellt wird, erhalte ich einen Fehler, wenn ich getWebsites(). Dann() ('then() ist keine Funktion') Können Sie um diesen Kern zu sehen? https://gist.github.com/Codeia/0711bbdc5eb555af19b136f040f3dcf5 – user3800799