【问题标题】:AngularJs json URL changerAngularJs json URL 转换器
【发布时间】:2015-08-07 17:22:04
【问题描述】:

出于练习的原因,我正在 Angular 中开发一些大型简单的天气应用程序,但我被卡住了..

我有一个像这样的角度 json 提要:

app.factory('forecast', ['$http', function($http) { 
return $http.get('http://api.openweathermap.org/data/2.5/weather?q=Amsterdam,NL&lang=NL_nl&units=metric') 
        .success(function(data) { 
          return data; 
        }) 
        .error(function(err) { 
          return err; 
        }); 
}]);

并将提要加载到 index.html 中。一切正常,我现在想要的是索引上的输入表单,它更改了 js/services/forcast.js 上 url 的 Amsterdam 部分,上面的代码位于另一个城市,这样人们就可以看到他们的城市天气。

在此处查看演示:http://dev.bigstoef.nl/workspace/shiva/weer/index.html

我现在已经尝试了所有可行的选项,而且我还有 3 天的时间,这是不行的。这里有什么正确的方法吗?

【问题讨论】:

  • 控制器代码是什么?
  • app.controller('MainController', ['$scope', 'forecast', function($scope, forecast) { forecast.success(function(data) { $scope.weer = data; }); }]);

标签: javascript json angularjs url


【解决方案1】:

首先,创建一个“可配置”服务:

app.factory('forecast', ['$http', function($http) { 
    var city;
    var cities = {
        amsterdam: 'Amsterdam,NL',
        paris: 'Paris,FR'
    };
    var api_base_url = 'http://api.openweathermap.org/data/2.5/weather';
    var other_params = 'lang=NL_nl&units=metric';

    return {
        setCity: function(cityName){
            city = cityName ;
            console.log(city);
        },
        getWeather: function(cityName){
          console.log(city);
            if(cityName) this.setCity(cityName);
            if (!city) throw new Error('City is not defined');
            return $http.get(getURI());
        }
    }

    function getURI(){
        return api_base_url + '?' + cities[city] + '&' + other_params;
    }
}]);

然后你可以像下面这样创建一个控制器:

app.controller('forecastCtrl', ['$scope', 'forecast',function($scope,forecast){

$scope.city = 'amsterdam' ;

    $scope.$watch('city',function(){
      console.log($scope.city);
      forecast.setCity($scope.city);
    });

$scope.getWeather = function(){
  console.log('get weather');
    forecast.getWeather()
    .success(function(data){
    console.log('success',data);
    $scope.weatherData = data;
    }).error(function(err){
      console.log('error',err);
      $scope.weatherError = err; 
    });    
}; 
}]);

如下实现一个模板

<link rel="stylesheet" href="style.css" />

<div data-ng-controller="forecastCtrl">

  <form>

    <label>
      <input type="radio" name="city" data-ng-model="city" data-ng-value="'amsterdam'">Amsterdam
    </label>
    <br/>
    <label>
      <input type="radio" name="city" data-ng-model="city" data-ng-value="'paris'">Paris
    </label>
    <br/>

    <button data-ng-click="getWeather()">Get Weather</button>

  </form>  

  <p class="weather-data">
    {{weatherData}}
  </p>
  <p class="weather-error">
    {{weatherError}}
  </p>

</div>

<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<script src="script.js"></script>

你可以在这里查看代码:http://plnkr.co/edit/rN14M8GGX62J8JDUIOl8?p=preview

【讨论】:

  • 您似乎错过了在 index.html 中包含 ForecastCtrl 或拼写错误(大写?)。在我的示例代码中,我使用了小写的forecastCtl。在模板和js中。但是在您的 index.html 中,您使用了大写的 &lt;script src="js/controllers/ForecastCrtl.js"&gt;&lt;/script&gt;。将其替换为 &lt;script src="js/controllers/forecastCrtl.js"&gt;&lt;/script&gt; 以开始工作
  • 我明白了。那是我的愚蠢..但我改变了这一切,仍然不行......我在这里做错了什么......
  • 好的,控制器中存在语法错误。请参阅我的帖子中的编辑 CTRL。
  • 你刚刚删除了整个 CTRL ...只需将第一个 $scope.getWeather 函数替换为新函数
【解决方案2】:

将服务代码更改为具有专用方法,您可以使用不同的参数(城市)多次调用该方法:

app.factory('forecast', ['$http', function($http) {
    return {
        load: function(location) {
            return $http.get('http://api.openweathermap.org/data/2.5/weather?q=' + location + '&lang=NL_nl&units=metric')
            .success(function(data) {
                return data;
            })
            .error(function(err) {
                return err;
            });
        }
    }
}]);

然后在控制器中,您可以在需要时为其他位置加载预测:

forecast.load('Amsterdam,NL').then(function(data) {
    $scope. weer = data;
});

演示: http://plnkr.co/edit/GCx35VxRoko314jJ3M7r?p=preview

【讨论】:

  • 好的,我得到了这个代码!很抱歉成为一个超级菜鸟。但是我现在如何通过输入表单更改“位置”?
  • 这取决于您的应用程序。在我的演示中,我提供了简单的输入字段来输入位置。它可以是下拉菜单,也可以是其他任何东西。查看演示。
  • 我试过了,但我似乎无法将它放入我的代码中......当我做角停止工作......
【解决方案3】:

你可以在你的工厂里返回一个函数。将您的 forcast 定义为

app.factory('forecast', ['$http', function($http) { 
 return {
     query: function(city) {
         return $http.get('http://api.openweathermap.org/data/2.5/weather?q=' + city + '&lang=NL_nl&units=metric') 
        .success(function(data) { 
          return data; 
        }) 
        .error(function(err) { 
          return err; 
        });
     }
 };

}]);

然后在你的控制器中

forecast.query('Amsterdam,NL').success(function(data) {
  $scope.weer = data;
});

【讨论】:

    猜你喜欢
    • 2015-09-02
    • 1970-01-01
    • 2016-11-02
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多