2017-07-03 4 views
1

Ich arbeite derzeit an einem Projekt, um mir zu helfen, angularjs besser zu verstehen! Ich bin derzeit fest, wie man einen Parameter vom Controller an den Service übergibt.Wie Param von Controller zu Service in AngularJs übergeben werden

In meinem Programm habe ich eine Funktion namens "GetForecastByLocation" erstellt, wenn ein Benutzer eine Eingabe eingibt klickt auf eine Schaltfläche. Von dort möchte ich ihre Eingabe nehmen und sie dann an den http-Aufruf in service.js übergeben.

Ursprünglich war $ http.get in einer langen, riesigen Zeichenfolge der API-URL, aber ich googelte herum und es scheint, dass ich Parameter verwenden sollte, wenn ich versuche, einen Teil der Zeichenfolge zu ändern. Im Moment weiß ich, dass der Parameter in einer bestimmten Stadt fest codiert ist, aber ich möchte neue Eingaben machen und den Wert von vm.city an den $ http.get-Aufruf übergeben.

Wenn jemand helfen kann würde ich es sehr schätzen. Vielen Dank!

controller.js

var app = angular.module('weatherApp.controllers', []) 
    app.controller('weatherCtrl', ['$scope','Data', 
     function($scope, Data) { 

     $scope.getForecastByLocation = function(myName) { 
      $scope.city = myName; 
      Data.getApps($scope.city);}, 

     Data.getApps(city) 
     .then(function(data)){ 
     //doing a bunch of things like converting units, etc 
     }, 
     function(res){ 
      if(res.status === 500) { 
      // server error, alert user somehow 
     } else { 
      // probably deal with these errors differently 
     } 
     }); // end of function 
}]) // end of controller 

service.js

.factory('Data', function($http, $q) { 
     var data = [], 
      lastRequestFailed = true, 
      promise; 
     return { 
      getApps: function() { 
      if(!promise || lastRequestFailed) { 
      promise = $http.get('http://api.openweathermap.org/data/2.5/weather?',{ 
       params: { 
       q: Tokyo, 
       } 
      }) 
      .then(function(res) { 
       lastRequestFailed = false; 
       data = res.data; 
       return data; 
      }, function(res) { 
       return $q.reject(res); 
      }); 
     } 
     return promise; 
     } 
    } 
}); 
+0

Warum nicht fügen Sie einen Parameter auf 'getApps'? Die Fabrik würde aussehen wie 'getApps: function (city) {... 'und die Callsite wie' Data.getApps ($ scope.city) '' – Will

+0

hi @wilusdaman! Tut mir leid, aber ich bin sehr neu bei angularjs. Wenn Sie den vollständigen Code zeigen können, würde ich es sehr schätzen! Vielen Dank! // Benötige ich in Ihrem Code noch Params? Wenn ich richtig verstehe, fülle der Wert von Funktion (Stadt) q: Stadt, richtig? – hiswendy

Antwort

1

davon zu einer Factory-Methode Argumente ist nicht anders als Argument für eine einfache alte Funktion übergeben.

Zuerst getApps einrichten, einen Parameter zu übernehmen:

.factory('Data', function($http, $q){ 
    // ... 
    return { 
     getApps: function(city){ 
      promise = $http.get(URL, { 
       params: {q: city} 
      }).then(/* ... */); 
      // ... 
      return promise; 
     } 
    }; 
}); 

Dann ist es Ihr Argument übergeben:

$scope.getForecastByLocation = function(myName) { 
    $scope.city = myName; 
    Data.getApps($scope.city); 
} 
+0

danke! Ich weiß, das wird funktionieren, weil ich versucht habe, einen Parameter zu übergeben, und es hat sich geändert. Ich hoffe, das ist in Ordnung zu fragen, aber ich habe eine Frage nachgeholt. So früher, ich habe nicht meinen gesamten controller.js Code gezeigt und jetzt habe ich es aktualisiert, aber die Funktion, die gerufen wird, nachdem der Knopf geklickt wird, sendet die Stadt nicht zum Service. Ich denke das wegen vielleicht wo ich getForecastbyLocation in den Controller gelegt habe. Ich denke, es ist an der falschen Stelle, aber ich bin mir nicht sicher, wo ich es platzieren soll. Haben Sie Anregungen/Ratschläge? Nochmals vielen Dank! – hiswendy

+0

Wie sieht dein 'ng-Klick' aus? – Will

+0

Es sieht im Moment so aus: ' SUBMIT' – hiswendy

0

Es ist wie ein Wert einer Funktion Kontextvariablen zu setzen.

Services.js

Einfaches Beispiel für einen Dienst.

.factory('RouteService', function() { 
    var route = {}; // $Object 

    var setRoute_ = function(obj) 
    { 
     return route = obj; 
    }; 

    var getRoute_ = function() 
    { 
     if(typeof route == 'string') 
     { 
      return JSON.parse(route); 
     } 

     return null; 
    }; 

    return { 
     setRoute: setRoute_, 
     getRoute: getRoute_ 
    }; 
}) 

Controllers.js

einfaches Beispiel für Service-Nutzung:

.controller('RoutesCtrl', function ($scope, RouteService) { 
    // This is only the set part. 
    var route = { 
     'some_key': 'some_value' 
    }; 

    RouteService.setRoute(route); 
}) 
Verwandte Themen