Angular+ionic+cordova實(shí)現(xiàn)天氣App

開(kāi)發(fā)環(huán)境及工具
參考教程:Cordova+Vue實(shí)現(xiàn)Android APP開(kāi)發(fā)中的環(huán)境配置(http://www.reibang.com/p/fd7448e2985a

Angular,ionic枕稀,cordova版本
angualr@5.0.0
ionic@3.16.0
cordova@8.0.0

創(chuàng)建項(xiàng)目

1.安裝ionic和cordova CLI
npm install -g ionic@3.16.0 cordova
不建議安裝最新版的ionic埠戳,經(jīng)過(guò)測(cè)試有些未知bug
2.生成項(xiàng)目
ionic start iweather tabs
tabs為可選項(xiàng)傍衡,若不輸入tabs命令行會(huì)提示安裝你想要的app布局褒脯。
3.用瀏覽器運(yùn)行項(xiàng)目
cd iweather
ionic serve
運(yùn)行成功瀏覽器會(huì)出現(xiàn)如下界面

Hello Ionic.png

到這里基本的開(kāi)發(fā)環(huán)境都搭建好了圈暗,現(xiàn)在開(kāi)始開(kāi)發(fā)程序康聂。

開(kāi)發(fā)之前請(qǐng)?jiān)诎⒗镌粕暾?qǐng)?zhí)鞖夥?wù)API啡邑,天氣圖片可以通過(guò)墨跡天氣官方網(wǎng)站抓取數(shù)據(jù)产徊,并封裝成自己的天氣服務(wù)API昂勒。

項(xiàng)目需求及預(yù)覽效果

1.顯示城市天氣情況
2.查詢(xún)?nèi)珖?guó)各地天氣

預(yù)覽1.jpg

預(yù)覽2.jpg
預(yù)覽3.jpg

開(kāi)發(fā)三個(gè)頁(yè)面主頁(yè),關(guān)于舟铜,設(shè)置戈盈,主頁(yè)面顯示天氣信息,關(guān)于頁(yè)面顯示開(kāi)發(fā)者信息谆刨,設(shè)置頁(yè)面通過(guò)設(shè)置城市名稱(chēng)獲取不同城市的天氣塘娶。

本次主要任務(wù)是首頁(yè)和設(shè)置頁(yè)面的開(kāi)發(fā)以及天氣服務(wù)數(shù)據(jù)的開(kāi)發(fā)

天氣服務(wù)數(shù)據(jù)開(kāi)發(fā)

之所以先開(kāi)發(fā)天氣服務(wù)數(shù)據(jù),是因?yàn)槭醉?yè)的數(shù)據(jù)都依賴(lài)于天氣服務(wù)數(shù)據(jù)痊夭。
用ionic命令行創(chuàng)建一個(gè)獲取天氣的http服務(wù)
ionic g provider weather
創(chuàng)建此服務(wù)需要以下幾步:
1.引入HttpClient, HttpHeaders兩個(gè)模塊刁岸,實(shí)現(xiàn)獲取天氣數(shù)據(jù)的http服務(wù)
2.使用 Injectable 裝飾器,該服務(wù)需要在其他使用此服務(wù)的構(gòu)造函數(shù)中注入依賴(lài)對(duì)象她我。
3.獲取天氣的相關(guān)數(shù)據(jù)

weather.ts

此時(shí)獲取天氣的數(shù)據(jù)服務(wù)就完成了,數(shù)據(jù)獲取完畢后就需要將數(shù)據(jù)渲染到頁(yè)面上虹曙。

APP首頁(yè)開(kāi)發(fā)

首頁(yè)需要顯示當(dāng)前城市的天氣數(shù)據(jù),包括城市番舆,天氣圖標(biāo)酝碳,溫度,風(fēng)向等信息恨狈。
用ionic命令行創(chuàng)建一個(gè)首頁(yè)頁(yè)面疏哗。
ionic g page home
構(gòu)建此頁(yè)面需要以下幾步
1.頁(yè)面布局的開(kāi)發(fā)。
2.頁(yè)面數(shù)據(jù)的展示禾怠。
3.頁(yè)面數(shù)據(jù)的控制沃斤。
頁(yè)面布局使用ionic提供的UI組件進(jìn)行布局圣蝎,頁(yè)面數(shù)據(jù)展示主要通過(guò)插值表達(dá)式顯示數(shù)據(jù),對(duì)頁(yè)面的數(shù)據(jù)進(jìn)行控制主要在angualr的控制器中進(jìn)行控制衡瓶。
home.html里面進(jìn)行代碼編寫(xiě)展示組件代碼徘公,和HTML標(biāo)簽一樣,你也可以理解為一個(gè)個(gè)ionic封裝好的UI組件,使用非常方便哮针。具體參考文檔(https://ionicframework.com/docs/components/#overview)這里面基本包括了一些常用的頁(yè)面控件关面。(代碼:https://github.com/Xutaotaotao/ionic_weather/blob/master/src/pages/home/home.html
home.sass里面編寫(xiě)頁(yè)面樣式代碼來(lái)控制頁(yè)面樣式。這部分代碼較為簡(jiǎn)單就不做相應(yīng)的展示十厢,最后會(huì)附上github地址等太。
home.ts里面編寫(xiě)代碼進(jìn)行對(duì)展示數(shù)據(jù)的控制。
控器主要實(shí)現(xiàn)對(duì)頁(yè)面數(shù)據(jù)進(jìn)行初始化蛮放,根據(jù)設(shè)置界面設(shè)置的城市名從新渲染主頁(yè)的數(shù)據(jù)缩抡,獲取設(shè)置城市名通過(guò)本地存儲(chǔ)的方式獲取,以便第二次進(jìn)入App還是設(shè)置時(shí)的城市數(shù)據(jù)包颁。

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
// 引入WeatherProvider服務(wù)
import { WeatherProvider } from '../../providers/weather/weather';
// 引入數(shù)據(jù)存儲(chǔ)
import { Storage } from '@ionic/storage'

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {
  // 定義控制器中需要用到的數(shù)據(jù)及類(lèi)型
  weatherResult:any;
  weather:any
  weatherImg:string;
  location:{
    city:string,
  };
  // 使用構(gòu)造注入的方式注入依賴(lài)對(duì)象
  constructor(
    public navCtrl: NavController,
    private weatherProvider:WeatherProvider,
    private storage:Storage
  ){}
  // 初始化視圖數(shù)據(jù)
  ionViewWillEnter(){
    // 獲取本地儲(chǔ)存的數(shù)據(jù)并根據(jù)城市名稱(chēng)初始化城市數(shù)據(jù)
    this.storage.get('location').then((val) => {
      // 如果本地儲(chǔ)存的數(shù)據(jù)不為空
      if(val != null){
        this.location = JSON.parse(val);
      }else{
        this.location = {
          city:'北京',
        }
      }
      // 用天氣服務(wù)獲得當(dāng)前城市的天氣數(shù)據(jù)
      this.weatherProvider.getWeather(this.location.city)
        .subscribe(weatherResult => {
         this.weatherResult = weatherResult;
         // 天氣對(duì)象
         this.weather = this.weatherResult.result;
         // 天氣圖片使用墨跡天氣的鏈接拼接imgurl
         this.weatherImg = 'http://www.moji.com//templets/mojichina/images/weather/weather/w'+this.weather.img+".png";
        }
      )
    })
  }
}

關(guān)于頁(yè)面開(kāi)發(fā)

用ionic命令行創(chuàng)建一個(gè)關(guān)于頁(yè)面瞻想。
ionic g page about
關(guān)于頁(yè)面不涉及邏輯,直接貼代碼

<!-- 頭部 -->
<ion-header>
  <ion-navbar>
    <ion-title>
      關(guān)于
    </ion-title>
  </ion-navbar>
</ion-header>

<!-- 頁(yè)面主體 -->
<ion-content padding>
  <ion-grid>
    <ion-row>
      <ion-col width-100>
        <ion-list>
          <ion-item>
            <strong>應(yīng)用名稱(chēng):</strong>濤燾的天氣
          </ion-item>
          <ion-item>
            <strong>應(yīng)用版本:</strong>1.0.0
          </ion-item>
          <ion-item>
            <strong>應(yīng)用描述:</strong>一個(gè)簡(jiǎn)單的天氣
          </ion-item>
        </ion-list>
      </ion-col>
    </ion-row>
  </ion-grid>
</ion-content>

設(shè)置頁(yè)面開(kāi)發(fā)

用ionic命令行創(chuàng)建一個(gè)設(shè)置頁(yè)面娩嚼。
ionic g page setting
設(shè)置頁(yè)面的主要功能是設(shè)置城市的名稱(chēng)并將設(shè)置值存儲(chǔ)到本地蘑险。

  • 設(shè)置界面UI控件
    主要就是一個(gè)輸入框和提交按鈕
    通過(guò)表單提交的方式將數(shù)據(jù)保存在本地存儲(chǔ)數(shù)據(jù)中。
<ion-header>
  <ion-navbar>
    <ion-title>設(shè)置</ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding>
  <ion-grid>
    <ion-row>
      <ion-col width-100>
        <form (ngSubmit)="saveFrom()">
          <ion-item>
            <ion-label fixed>
              城市
            </ion-label>
            <ion-input [(ngModel)]="city" name="city" type="text">   
            </ion-input>
          </ion-item>
          <button ion-button type="submit" class="ion">保存更改</button>            
        </form>
      </ion-col>
    </ion-row>
  </ion-grid>
</ion-content>
  • 設(shè)置組件的控制器
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
// 引入數(shù)據(jù)存儲(chǔ)
import { Storage } from '@ionic/storage';
import { HomePage } from '../home/home'

@IonicPage()
@Component({
  selector: 'page-settings',
  templateUrl: 'settings.html',
})
export class SettingsPage {
  // 初始城市數(shù)據(jù)類(lèi)型
  city:string;
  // 使用構(gòu)造注入的方式注入依賴(lài)對(duì)象
  constructor(
    public navCtrl: NavController, 
    public navParams: NavParams,
    private storage:Storage) {
      // 獲取本地儲(chǔ)存的數(shù)據(jù)并根據(jù)城市名稱(chēng)初始化城市數(shù)據(jù)岳悟,和主頁(yè)邏輯一樣
      this.storage.get('location').then((val) => {
        if(val != null){
          let location = JSON.parse(val);
          this.city = location.city;
        }else{
          this.city = "北京";
        }
      })
  }
  // 模板中form表單綁定的saveFrom方法
  saveFrom(){
    let location = {
      city:this.city,
    }
     // 保存輸入框的數(shù)據(jù)到本地存儲(chǔ)中
    this.storage.set('location',JSON.stringify(location));
    // 設(shè)置提交后返回主頁(yè)
    this.navCtrl.push(HomePage)
  }
}

到這里佃迄,一個(gè)簡(jiǎn)單的天氣APP就完成了。通過(guò)此實(shí)例你可以學(xué)習(xí)到贵少,ionic基本的UI控件使用呵俏,以及angualr創(chuàng)建一個(gè)服務(wù)實(shí)例的基本過(guò)程。

如果需要生成APP
執(zhí)行一下命令

  • Android APP

ionic cordova platform add android

ionic cordova build android

  • IOS APP

ionic cordova platform add ios

ionic cordova build ios

項(xiàng)目Demo的Github地址:https://github.com/Xutaotaotao/ionic_weather

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末滔灶,一起剝皮案震驚了整個(gè)濱河市普碎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宽气,老刑警劉巖随常,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異萄涯,居然都是意外死亡绪氛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)涝影,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)枣察,“玉大人,你說(shuō)我怎么就攤上這事⌒蚰浚” “怎么了臂痕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)猿涨。 經(jīng)常有香客問(wèn)我握童,道長(zhǎng),這世上最難降的妖魔是什么叛赚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任澡绩,我火速辦了婚禮,結(jié)果婚禮上俺附,老公的妹妹穿的比我還像新娘肥卡。我一直安慰自己,他們只是感情好事镣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布步鉴。 她就那樣靜靜地躺著,像睡著了一般璃哟。 火紅的嫁衣襯著肌膚如雪氛琢。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天沮稚,我揣著相機(jī)與錄音艺沼,去河邊找鬼册舞。 笑死蕴掏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的调鲸。 我是一名探鬼主播盛杰,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼藐石!你這毒婦竟也來(lái)了即供?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤于微,失蹤者是張志新(化名)和其女友劉穎逗嫡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體株依,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驱证,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恋腕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抹锄。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伙单,到底是詐尸還是另有隱情获高,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布吻育,位于F島的核電站念秧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏布疼。R本人自食惡果不足惜出爹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缎除。 院中可真熱鬧严就,春花似錦、人聲如沸器罐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)轰坊。三九已至铸董,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肴沫,已是汗流浹背粟害。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颤芬,地道東北人悲幅。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像站蝠,于是被迫代替她去往敵國(guó)和親汰具。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容