2017-02-14 3 views
1

habe ich den Dienst und die Steuerung in der gleichen js-Datei platziert. Also versuche ich, die Daten vom Dienst zu holen und benutze sie in meinem HTML. In meinem Code bin ich in der Lage, die Daten vom Dienst zu erzeugen, aber nicht in der Lage, es zu einem $scope in der Steuerung zuzuweisen und es im HTML zu verwenden. Wie also bekomme ich die Daten und weise sie der $scope zu, damit ich sie in meinem HTML benutzen kann.Mit den Servicedaten in der Steuerung

var app = angular.module("app",[]); 
app.factory('factoryServices',function($http){ 
    var newObject = {}; 
    var _getChart= function(){ 
     $http.get("http://citibikenyc.com/stations/json") 
     .success(function(data, status){ 
      if(data) { 
       return data; 
      } 
     }).error(function(data,status){ 
      return error; 
     }); 
    } 
    newObject.getChart = _getChart; 
    return newObject; 
}); 


app.controller("chartController",function($scope,$http,factoryServices){ 
    factoryServices.getChart($scope.chartServicesCompleted); 
    $scope.chartServicesCompleted = function(data){ 
     $scope.serviceResponse = data; 
    } 
}) 
+1

Einige gute Antwort wurden bereits gelegt, aber ich möchte auch auf die Tatsache, dass Sie immer noch mit .SUCESS() und .ERROR() für die Behandlung Ihrer Versprechen. Ich empfehle dringend, zu .then() umzuschalten, da .success() und .error() in 1.6 veraltet und vollständig entfernt wurden. –

Antwort

2

Wenn Sie Ihren Code wie folgt neu schreiben, sollte es wie erwartet:

var app = angular.module("app",[]); 
app.factory('factoryServices',function($http){ 
    var newObject = {}; 
    var _getChart= function(){ 
     return $http.get("http://citibikenyc.com/stations/json") 
     .then(function(response){ 
      if(response.data) { 
       return response.data; 
      } 
     }, function(response){ 
      console.error("getChart failed with ",response); 
     }); 
    } 
    newObject.getChart = _getChart; 
    return newObject; 
}); 

und dem Controller

app.controller("chartController",function($scope,$http,factoryServices){ 
    factoryServices.getChart().then(chartServicesCompleted); 

    function chartServicesCompleted(data){ 
     $scope.serviceResponse = data; 
    } 
}) 

Der Grund Ihrer ursprünglichen Code nicht funktioniert, liegt daran, Ihr getChart nimmt nicht wirklich ein Argument. So übergeben Sie Ihren Rückruf wie folgt: getChart($scope.chartServicesCompleted) tut nichts. In dem umgeschriebenen Code habe ich es so gemacht, dass die getChart Funktion das Versprechen zurückgibt, das von $http.get(..) erstellt wird, das Ihnen dann ermöglicht, .then([callback]) in Ihrem Controller zu verwenden.

+1

Ihr Code ist der Korrekteste aus der Antwort, keine Ahnung, warum Sie downvoted wurden. –

+0

@GiovaniVercauteren Ich stimme zu. Ich habe meine Antwort auch so bearbeitet, dass das Neuschreiben 'then' statt der veralteten' success'- und 'error'-Funktionen verwendet. –

+0

wenn ich die Datei im Browser (Chrome) ausführen. Es endet in einer Endlosschleife ... warum passiert es? – devanya

0

Sie übergeben eine Callback-Funktion, aber nicht innerhalb der Service-Methode zu behandeln.

ändern sich als

var _getChart= function(callback){ 
     $http.get("http://citibikenyc.com/stations/json") 
     .success(function(data, status){ 
      callback(data); 
     }).error(function(data,status){ 
      callback(data); 
     }); 
    } 

jetzt factoryServices.getChart($scope.chartServicesCompleted); arbeiten Sie durch den Umgang mit Erfolgs- und Fehler Rückruf separat allgemeineren machen kann.

oder ein weiterer Weg ist es, die Erfolgs- und Fehlerlogik in Ihrem Controller zu implementieren.

aber vergessen Sie nicht, den Funktionstyp d.h

if(typeof callback == 'function'){ 
    callback(data); 
} 

bearbeiten zu überprüfen: wie pro fortgeschritten Sie Versprechen umzusetzen nennen.

Wenn Sie die eckige Version 1.6 verwenden, wurden die Erfolgs- und Fehlermethoden abgeschrieben.

zweitens können Sie innerhalb Dienst tun die HTTP-Objekt

var _getChart= function(){ 
      return $http.get("http://citibikenyc.com/stations/json");    
     } 

und dann das Versprechen in ähnlichem Controller Griff

factoryServices.getChart().then(successMethod, error method); 
+0

Befreien Sie sich von Rückrufen und nutzen Sie Versprechungen. Kommst du von jQuery? ^^ – lin

+0

wir alle wissen über Versprechen, die Person scheint neue Lerner zu sein. Sie müssen ihnen Schritt weise beibringen –

+0

Lehre falsches Verhalten ist nicht ein guter Ansatz überhaupt. – lin

0

Lassen Sie den Service, das Versprechen an die Steuerung zurück. ex:

var _getChart= function(){ 
    return $http.get("http://citibikenyc.com/stations/json"); 
} 

und in der Controller-Handle das Versprechen. Verwenden Sie ‚dann‘ statt

factoryServices.getChart().then(function(response){var theDate = response.data},function(error){}); 

Sie Methoden stattdessen in der Steuerung für den Umgang mit dem Erfolg und Fehlern

factoryServices.getChart).then(onSuccess,onError); 

Don verwenden, um die .success Methode und .error Methode deklarieren können. Sie verhalten sich nicht wie andere Versprechen.Also gewöhnen Sie sich an "dann"

Sie müssen wirklich nicht mit Fehlern in der Service-Methode umgehen.Ich benutze eckige Interzeptoren in den meisten Fällen. Überprüfen Sie sie heraus. Aber manchmal müssen Sie den Fehler im Controller behandeln. Also ist es gut, den Rückruf in der Steuerung zu bekommen

+0

Ihre Antwort ist größtenteils korrekt, aber die ersten paar Zeilen sind eklatant falsch, das newObject ist immer die gleiche Instanz; Angular Services sind Singletons von Natur aus. Ich schlage vor, dass Sie diesen Teil entfernen, da er neuen eckigen Entwicklern die falsche Vorstellung geben könnte. –

+0

Danke, dass ich das tue –

Verwandte Themen