$http連線取得JSON資料
$http實際上是發出http要求,進而取得回應資料。如果格式是JSON,在JavaScript中便可直接使用,其他格式則不一定。$http連線使用方式如下:
$http.get("http://url/service", { params: { "key1": "value1", "key2": "value2" } }) .success(function(response) { // 處理http回應資料; response為回傳資料 }) .error(function(err) { // 連線錯誤 });另一種寫法則是:
$http.get("http://url/service", { params: { "key1": "value1", "key2": "value2" } }) .then(function(response) { // 建立天氣資料模型變數,response.data為回傳資料 }, function(err) { // 連線錯誤 });兩者有所差別,可參考此討論串。在此建議用
.then(function(resp),function(err))
以open weather map即時天氣資料為例,其api格式是:
http://api.openweathermap.org/data/2.5/weather?q=Taipei因此對應的程式碼為:
$http.get("http://api.openweathermap.org/data/2.5/weather", { params: { "q": "Taipei"} }) .then(function(response) { // 建立天氣資料模型變數,response.data為回傳資料 }, function(err) { // 連線錯誤 });有了$http連線服務,取得天氣即時資訊變得非常簡單。
即時天氣資料呈現
以前文Hybrid Apps開發系列之4.4:多頁面App程式 (天氣app-非線上版)天氣概況頁面為基礎,並在controller處加上$http連線,便可呈現即時天氣資料。此處以單一頁面為例,將天氣概況頁面的程式碼直接放入index.html中,並加入一個按鈕,程式碼如下:<body ng-app="starter"> <ion-header-bar class="bar-stable"> <h1 class="title">天氣概況:Json版</h1> </ion-header-bar> <ion-content ng-controller="controller"> <button ng-show="!show" ng-click="getData()">取得資料</button> <div class="list card" ng-show="show"> <div class="item"> <h2>City of {{weather.name}}</h2> </div> <div class="item item-avatar"> <img src="{{img_base_url + weather.weather[0].icon + '.png'}}"> <h2>{{weather.main['temp'] - 273.15| number:1}}°C</h2> <h2>{{(weather.dt)*1000 | date:'yyyy-MM-dd HH:mm:ss'}}</h2> </div> <div class="item"> <div class="row"> <div class="col">濕度</div> <div class="col">{{weather.main.humidity}}%</div> </div> <div class="row"> <div class="col">風速</div> <div class="col">{{weather.wind.speed}}哩/秒</div> </div> </div> </div> </ion-content> </body>
- 第5行:由於是單一頁面,故直接在<ion-content>設定處理此區塊的controller。
- 第6行:加入按鈕,點選之後呼叫getData()取得資料,同時隱藏按鈕。
- 第7行:ng-show的設定讓區塊先隱藏起來,取得資料後再呈現。
[...略...] .controller('controller', function ($scope, $http) { $scope.show = false; $scope.img_base_url = image_base_url; $scope.getData = function () { $http.get("http://api.openweathermap.org/data/2.5/weather", {params: {"q": "Taipei"}}) .then(function (resp) { $scope.weather = resp.data; $scope.show = true; }, function (err) { alert("Oops!"); }) } }) var image_base_url = "http://openweathermap.org/img/w/"; // open weather api icon
- 第2行:定義controller時要加入$http模組。
- 第3行:$scope.show用來控制按鈕與天氣概況的顯示狀態。
- 第5-14行:getData()定義。
沒有留言:
張貼留言