首頁 >微信小程式 >小程式開發 >微信小程式開發之「微天氣」教程(二)

微信小程式開發之「微天氣」教程(二)

Y2J
Y2J原創
2017-04-22 17:12:512557瀏覽

摘要: 上期我們介紹了「微天氣」的API與介面程式碼編寫,今天我們繼續介紹邏輯層程式碼以及查詢程式碼的編寫。 本文選自《從零開始學習微信小程式開發》。

編寫邏輯層程式碼

  由於在index.js中還沒有設定初始化數據,所以在介面中看不到具體的數據,從而也導致界面的效果未達到設定的要求。
  接下來就編寫邏輯層程式碼index.js,為了檢查介面設計效果,先寫初始數據,然後再逐步深入地寫其他相關業務邏輯程式碼。

1 寫資料初始化程式碼

  在index.wxml中寫了很多數據,因此需要在index.js中先把這些數據進行初始化,然後在開發工具的模擬器中就可預覽結果。
  開啟index.js文件,刪除原來的內容,重新編寫以下程式碼:

Page({  data: {    weather:{      wendu:18,      ganmao:'昼夜温差较大,较易发生感冒,请适当增减衣服。体质较弱的朋友请注意防护。',      yesterday:{        date:'17日星期四',        type:'阴',        fx:'南风',        fl:'微风级',        low:'低温 8℃',        high:'高温 16℃'
      },      forecast:[
        {          date:'18日星期五',          type:'阴',          high:'高温 16℃',          low:'低温 8℃',          fengxiang:'南风',          fengli:'微风级'
        },{          date:'18日星期五',          type:'阴',          high:'高温 16℃',          low:'低温 8℃',          fengxiang:'南风',          fengli:'微风级'
        },{          date:'18日星期五',          type:'阴',          high:'高温 16℃',          low:'低温 8℃',          fengxiang:'南风',          fengli:'微风级'
        },{          date:'18日星期五',          type:'阴',          high:'高温 16℃',          low:'低温 8℃',          fengxiang:'南风',          fengli:'微风级'
        },{          date:'18日星期五',          type:'阴',          high:'高温 16℃',          low:'低温 8℃',          fengxiang:'南风',          fengli:'微风级'
        }
      ]
    },    today:'2016-11-18',    city:'北京',    //城市名称
    inputCity:'', //输入查询的城市名称
  }
})

  編寫好以上初始化資料之後,儲存index.js,在開發工具左側預覽區域可看到如下的介面效果。
                            微信小程式開發之「微天氣」教程(二)  

#以上程式碼很長,主要是由於模擬了5天的天氣數據,實際上,在天氣後打開程式很長,主要是因為模擬了5天的天氣數據,實際上,在天氣後打開程式很長,主要是由於模擬了5天的天氣數據,實際上,在天氣後打開,因此上面的初始化資料程式碼中,只需要用以下語句將weather初始化為一個空物件即可,而上面添加在weather中的屬性資料都可以刪除。

weather:{}

2 取得目前位置的城市名稱

#  根據本案例的要求,當使用者開啟本案例之後,首先要取得使用者當前所在城市的天氣訊息,這就需要取得使用者目前所在城市的名稱。要完成這個功能,就需要經過幾個轉折。
  首先,可以使用微信小程式的取得目前地理位置經緯度的API(也就是wx. getLocation),透過此API即可取得使用者所在位置的經緯度。
  有了使用者所在的經緯度,也需要查詢該經緯度對應的城市名稱。這可以使用百度地圖的介面來實現,百度地圖Geocoding API服務位址如下:
  api.map.baidu.com/geocoder/v2/
  呼叫該介面需要傳遞以下幾個參數。

output:設定介面回傳的資料格式為json或xml。

ak:這是必須設定的一個參數,是使用者在百度申請註冊的key,自v2開始參數修改為“ak”,之前版本參數為“key”。

sn:若使用者所用ak的校驗方式為sn校驗時此參數必須啟用。

callback:一個回呼函數,將json格式的回傳值透過callback函數傳回以實作jsonp功能。

例如,在瀏覽器中輸入以下位址:
api.map.baidu.com/geocoder/v2/ak=ASAT5N3tnHIa4APW0SNPeXN5&location=30.572269,104.066541&output=json&pois=0 如下圖所示:

{  "status": 0,  "result": {    "location": {      "lng": 104.06654099999996,      "lat": 30.572268897395259
    },    "formatted_address": "四川省成都市武侯区G4201(成都绕城高速)",    "business": "",    "addressComponent": {      "country": "中国",      "country_code": 0,      "province": "四川省",      "city": "成都市",      "district": "武侯区",      "adcode": "510107",      "street": "G4201(成都绕城高速)",      "street_number": "",      "direction": "",      "distance": ""
    },    "pois": [],    "poiRegions": [],    "sematic_description": "环球中心w6区西南108米",    "cityCode": 75
  }
}

  在以上JSON資料中,透過result.addressComponent.city可取得傳入經緯度對應的城市名稱。因此,在本案例中可透過這種方式取得使用者目前所在城市的名稱。

  根據上述分析,在index.js的onLoad事件處理函數中寫如下所示程式碼:

var util = require('../../utils/util.js');
Page({  data: {
        ……
  },onLoad: function (options) {    this.setData({      today:util.formatTime(new Date()).split(' ')[0]  //更新当前日期
    });    var self = this;
    wx.getLocation({      type: 'wgs84',      success: function (res) {
        wx.request({          url:'http://api.map.baidu.com/geocoder/v2/' + 
             '?ak=ASAT5N3tnHIa4APW0SNPeXN5&location='+
              res.latitude+',' + res.longitude + '&output=json&pois=0',          data: {},          header: {            'Content-Type': 'application/json'
          },          success: function (res) {  var city = res.data.result.addressComponent.city.replace('市','');//城市名称
            self.searchWeather(city);  //查询指定城市的天气信息
          }
        })
      }
    })
  },
})

  以上程式碼中,第1行使用require匯入工具方法,用來格式化日期。

3 根據城市名稱取得天氣預報

#  取得了城市名稱,接下來就可使用以下介面取得指定城市名稱的天氣預報資訊:

  wthrcdn.etouch.cn/weather_mini?city=城市名稱
  在上面的介面中,城市名稱中不包含「市」這個字,如「成都市」只需要傳入「成都」。
  在本節前面介紹該介面時,只查看了介面執行成功後返回的JSON數據,如果傳入的城市名稱有誤,則返回如下所示JSON數據:

{  "desc": "invilad-citykey",  "status": 1002}

  在程序中可透過status判斷資料查詢是否成功。

  由於根據城市名稱查詢天氣預報資訊的程式碼需要重複調用,因此,單獨編寫成一個函數,方便在查詢時調用。

//根據城市名稱查詢天氣預報資訊


#

searchWeather:function(cityName){    var self = this;
    wx.request({      //天气预报查询接口
      url: 'http://wthrcdn.etouch.cn/weather_mini?city='+cityName,
      data: {},
      header: {        'Content-Type': 'application/json'
      },
      success: function (res) {        if(res.data.status == 1002) //无此城市
        {            //显示错误信息
            wx.showModal({
              title: '提示',
              content: '输入的城市名称有误,请重新输入!',
              showCancel:false,
              success: function(res) {                self.setData({inputCity:''});
              }
            })
        }else{          var weather = res.data.data;  //获取天气数据
          for(var i=0;i<weather.forecast.length;i++)
          {            var d = weather.forecast[i].date;            //处理日期信息,添加空格
            weather.forecast[i].date = &#39; &#39; + d.replace(&#39;星期&#39;,&#39; 星期&#39;); 
          }          self.setData({
            city:cityName,      //更新显示城市名称
            weather:weather,    //更新天气信息
            inputCity:&#39;&#39;        //清空查询输入框
          })
        }
      }
    })
  }

  在上面代码中,获取的date中保存的是“19日星期六”这种格式的字符串,为了使日期和星期分别显示在两行中,这里使用了一种小技巧,就是在日期字符串中添加了2个全角状态的空格,这样在显示这个字符串时自动断行。
  编写好以上这些代码之后,保存,在开发工具左侧可看到已经获取当前的天气数据,而不是前面初始化的数据了。
                 微信小程式開發之「微天氣」教程(二)  

这样,本案例的主要代码就算编写完成了。不过,还只能显示用户当前所在地的天气信息,如果要查看其他城市的天气,还需要继续编写相应的查询代码。

查询天气预报

  查询代码的编写很简单,只需要获取用户输入的城市名称,然后传入searchWeather函数即可。具体的代码如下:

//输入事件  
inputing:function(e){    this.setData({inputCity:e.detail.value});
 },  //搜索按钮  bindSearch:function(){    this.searchWeather(this.data.inputCity);  }

  保存以上代码之后,在开发工具左侧模拟器中输入查询的城市名称,如输入“三亚”,单击“查询”按钮,界面中即可显示“三亚”的天气信息。

微信小程式開發之「微天氣」教程(二)

如果在下方输入框输入一个不存在的城市名称,将显示下面的提示信息。
                 

微信小程式開發之「微天氣」教程(二)

以上是微信小程式開發之「微天氣」教程(二)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn