2017-07-03 15 views
1

現在、私はangularjsの理解を助けるプロジェクトに取り組んでいます!私は現在、コントローラからサービスにパラメータを渡す方法に固執しています。AngularJsでコントローラからサービスにparamを渡す方法

私のプログラムでは、ユーザーがボタンをクリックして入力を入力すると、「GetForecastByLocation」という関数が作成されました。そこから私は入力を受け取り、service.jsのhttp呼び出しに渡したいと思います。

元々、$ http.getはAPI urlの長い巨大な文字列にありましたが、私は周りを探索しましたが、文字列の一部を変更しようとするときにパラメータを使用すると思われます。現在のところ、パラメータは特定の都市にハードコードされていますが、新しい入力を受け取り、vm.cityの値を$ http.get呼び出しに渡したいと思います。

いずれかが役に立ったら、私は大いに感謝します。ありがとうございました!ファクトリメソッドに引数を渡す

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

getApps' 'にパラメータを追加しないのはなぜ?工場は 'getApps:function(city){...'のようになり、 'Data.getApps($ scope.city)'のようなコールサイト – Will

+0

こんにちは@wilusdaman!申し訳ありませんが、私はangularjsにはとても新しいです。あなたが完全なコードを表示することができれば/私は非常にそれを感謝する精巧!ありがとうございました! //あなたのコードでは、まだparamsが必要でしょうか?私が正しく理解していれば、関数(都市)からの価値はq:都市に記入されますか? – hiswendy

答えて

1

は昔ながらの関数に引数を渡すよりも違いはありません。

まず、パラメータを受け入れるようにgetAppsを設定します。

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

そして、それをあなたの引数を渡す:

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

ありがとうございます!私はパラメータを渡すことを試みたので、これがうまくいくことが分かりました。私はこれが頼んでいいと思っていますが、フォローアップの質問があります。以前はコントローラ全体のコードを表示していませんでしたが、現在は更新していますが、ボタンをクリックした後に呼び出される関数は都市をサービスに送信していません。私はコントローラのgetForecastbyLocationをどこに配置したのかと考えています。私はそれが間違った場所にあると思うが、どこに置くべきかわからない。何かアドバイスやアドバイスはありますか?再びありがとう! – hiswendy

+0

あなたの 'ng-click'の外観はどうですか? – Will

+0

現在のところ、この SUBMIT ' – hiswendy

0

それはちょうど関数のコンテキスト変数に値を設定するようなものです。

Services.js

サービスの簡単な例。

.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

サービスの利用の

簡単な例:

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

    RouteService.setRoute(route); 
}) 
関連する問題