Ionic2 自學須知的基本知識點

http://www.cnblogs.com/zsl123/p/5991336.htmljavascript

Ionic(ionicframework)一款接近原生的HTML5移動App開發框架。css

IONIC 是目前最有潛力的一款 HTML5 手機應用開發框架。經過 SASS 構建應用程序,它提供了不少 UI 組件來幫助開發者開發強大的應用。 它使用 JavaScript MVVM 框架和AngularJS 來加強應用。提供數據的雙向綁定,使用它成爲 Web 和移動開發者的共同選擇。Ionic是一個專一於用WEB開發技術,基於HTML5建立相似於手機平臺原生應用的一個開發框架。Ionic框架的目的是從web的角度開發手機應用,基於PhoneGap的編譯平臺,能夠實現編譯成各個平臺的應用程序。html

注意:這裏講的是ionic2的知識點,畢竟它與ionic 1.0有着較顯著的區別。html5

 

(一)Ionic 的安裝與運行

 

一、 下載安裝 Node.js,能夠在命令行中使用node–v 命令查看當前安裝的node.js的版本;java

二、 使用 npm install ionic –g命令能夠安裝Ionic,不過須要注意的是此時安裝的版本爲Ionic 1.0版本。可使用npm install ionic@beta–g 安裝beta版本,如可使用npm installionic@2.0.0-beta.22 –g安裝beta.22版本;node

三、 安裝Ionic 後,可使用 ionic start ionicdemo --v2初始化一個空項目,默認採用tabs template做爲初始化項目的模板,若是須要其餘的模板,那麼在項目名稱後面添加上對應的模板名稱便可,如:ionic start ionicdemo tutorial --v2;(--v2參數明確了使用2.0版本去初始化項目)android

四、 使用 ionic serve能夠運行Ionic項目;ios

五、 使用 ionic platform add Android或ionic platform add iOS命令能夠添加兩個手機平臺的部署文件(使用ionicplatform list 命令能夠查看當前的平臺信息);git

六、 在項目中添加了兩個平臺的部署文件,能夠經過platform文件夾下進行查看,相應地,在Xcode導入ios部署文件或在Android studio導入Android部署文件,能夠進行相應地真機調試;angularjs

 

 

(二)Ionic頁面的生命週期

  1. // 頁面被加載完成後調用的函數,切換頁面時並不會進行從新加載,由於有cache的存在  
  2. onPageLoaded() {  
  3.   console.log('page 1: page loaded.');  
  4. }  
  5.   
  6. // 頁面即將進入的時候  
  7. onPageWillEnter() {  
  8.   // 在這裏能夠作頁面初始化的一些事情  
  9.   console.log('page 1: page will enter.');  
  10. }  
  11.   
  12. // 頁面已經進入的時候  
  13. onPageDidEnter() {  
  14.   console.log('page 1: page did enter.');  
  15. }  
  16.   
  17. // 頁面即將離開的時候  
  18. onPageWillLeave() {  
  19.   console.log('page 1: page will leave.');  
  20. }  
  21.   
  22. // 頁面已經離開的時候  
  23. onPageDidLeave() {  
  24.   console.log('page 1: page did leave.');  
  25. }  
  26.   
  27. // 從 DOM 中移除的時候執行的生命週期  
  28. onPageWillUnload() {  
  29.   
  30. }  
  31.   
  32. // 從 DOM 中移除執行完成的時候  
  33. onPageDidUnload() {  
  34.   
  35. }  

 

(三)Ionic組件

一、Tab控件

圖標:http://ionicframework.com/docs/v2/ionicons/ 

tabs.html

  1. <ion-tabs>  
  2.   <ion-tab [root]="tab1Root" tabTitle="Home" tabIcon="home"></ion-tab>  
  3.   <ion-tab [root]="tab2Root" tabTitle="About" tabIcon="information-circle"></ion-tab>  
  4.   <ion-tab [root]="tab3Root" tabTitle="Contact" tabIcon="contacts"></ion-tab>  
  5. </ion-tabs>  

 

 

  1. <ion-tabs>  
  2.   <ion-tab [root]="tab1Root" tabTitle="Home" tabIcon="home"></ion-tab>  
  3.   <ion-tab [root]="tab2Root" tabTitle="About" tabIcon="information-circle"></ion-tab>  
  4.   <ion-tab [root]="tab3Root" tabTitle="Contact" tabIcon="contacts" tabBadge="3"></ion-tab>  
  5. </ion-tabs>  


 

 

  1. <ion-tabs>  
  2.   <ion-tab [root]="tab1Root" tabTitle="Home" tabIcon="home"></ion-tab>  
  3.   <ion-tab [root]="tab2Root" tabTitle="About" tabIcon="information-circle"></ion-tab>  
  4.   <ion-tab [root]="tab3Root" tabTitle="Contact" tabIcon="contacts" tabBadge="3" tabBadgeStyle="danger"></ion-tab>  
  5. </ion-tabs>  


 

 

默認首先進入第三個tab頁面:

Html控制

 

  1. <ion-tabs selectedIndex="2">  
  2.   <ion-tab [root]="tab1Root" tabTitle="Home" tabIcon="home"></ion-tab>  
  3.   <ion-tab [root]="tab2Root" tabTitle="About" tabIcon="information-circle"></ion-tab>  
  4.   <ion-tab [root]="tab3Root" tabTitle="Contact" tabIcon="contacts" tabBadge="3" tabBadgeStyle="danger"></ion-tab>  
  5. </ion-tabs>  

 

 

JS控制

  1. <ion-tabs #mainTabs>  
  2.   <ion-tab [root]="tab1Root" tabTitle="Home" tabIcon="home"></ion-tab>  
  3.   <ion-tab [root]="tab2Root" tabTitle="About" tabIcon="information-circle" tabBadge="3" tabBadgeStyle="danger"></ion-tab>  
  4.   <ion-tab [root]="tab3Root" tabTitle="用戶中心" tabIcon="person"></ion-tab>  
  5. </ion-tabs>  

 

  1. import {Component} from '@angular/core';  
  2. import {HomePage} from '../home/home';  
  3. import {AboutPage} from '../about/about';  
  4. import {ContactPage} from '../contact/contact';  
  5.   
  6. import {Tabs} from 'ionic-angular';  
  7. import {Injectable, ViewChild} from '@angular/core';  
  8.   
  9. @Component({  
  10.   templateUrl: 'build/pages/tabs/tabs.html'  
  11. })  
  12. export class TabsPage {  
  13.   @ViewChild('mainTabs') tabRef: Tabs;  
  14.   
  15.   private tab1Root: any;  
  16.   private tab2Root: any;  
  17.   private tab3Root: any;  
  18.   
  19.   constructor() {  
  20.     // this tells the tabs component which Pages  
  21.     // should be each tab's root Page  
  22.     this.tab1Root = HomePage;  
  23.     this.tab2Root = AboutPage;  
  24.     this.tab3Root = ContactPage;  
  25.   }  
  26.   
  27.   ionViewDidEnter() {  
  28.     this.tabRef.select(2);  
  29.   }  
  30. }  

 

二、Button控件

  1. <button>Basic Button</button>  
  2. <button gray>Gray Button</button>  
  3. <button danger>Danger Button</button>  
  4. <button outline>Outline Button</button>  
  5. <button clear>Clear Button</button>  
  6. <button round>Round Button</button>  
  7. <button block>Block Button</button>  
  8. <button small>Small Button</button>  
  9. <button large>Large Button</button>  
  10. <button>  
  11.   <ion-icon name="home"></ion-icon>  
  12.   Button  
  13. </button>  
  14. <button>  
  15.   Button  
  16.   <ion-icon name="home"></ion-icon>  
  17. </button>  
  18. <button>  
  19.   <ion-icon name="home"></ion-icon>  
  20. </button>  

 

 

三、Input控件

  1. <ion-list>  
  2.   <ion-item>  
  3.     <ion-label floating>用戶名</ion-label>  
  4.     <ion-input type="text" value="" [(ngModel)]="user.username"></ion-input>  
  5.   </ion-item>  
  6.   <ion-item>  
  7.     <ion-label stacked>密碼</ion-label>  
  8.     <ion-input type="password" value="" [(ngModel)]="user.password"></ion-input>  
  9.   </ion-item>  
  10. </ion-list>  
  11. <button block (click)="showFill()">登陸</button>  

 

  1. export class ContactPage {  
  2.   public user = {  
  3.     username: 'parry',  
  4.     password: ''  
  5.   };  
  6.   
  7.   constructor(private navCtrl: NavController) {  
  8.   
  9.   }  
  10.   
  11.   showFill() {  
  12.     alert(this.user.username);  
  13.     console.log(this.user.password);  
  14.   }  
  15. }  

 

四、Loading控件、Alert控件

  1. import {Component} from '@angular/core';  
  2. import {NavController, LoadingController, AlertController} from 'ionic-angular';  
  3.   
  4. @Component({  
  5.   templateUrl: 'build/pages/contact/contact.html'  
  6. })  
  7. export class ContactPage {  
  8.   public user = {  
  9.     username: 'parry',  
  10.     password: ''  
  11.   };  
  12.   
  13.   constructor(private navCtrl: NavController,  
  14.               private loadingCtrl: LoadingController,  
  15.               private alertCtrl: AlertController) {  
  16.     this.navCtrl = navCtrl;  
  17.   }  
  18.   
  19.   showFill() {  
  20.     alert(this.user.username);  
  21.     console.log(this.user.password);  
  22.   }  
  23.   
  24.   login() {  
  25.     /*// 建立 loading 窗口,模擬3秒後登陸成功, loading 窗口消失 
  26.     let loading = Loading.create({ 
  27.       content: '正在登陸...', 
  28.       duration: 3000, //單位是毫秒 
  29.     }); 
  30.  
  31.     this.navCtrl.present(loading); 
  32.  
  33.     // 真實的邏輯應該是:去請求登陸的 API,返回結果後,進行loading窗口的隱藏 
  34.     setTimeout(() => { 
  35.       loading.dismiss(); 
  36.     }, 3000);*/  
  37.   
  38.     if(this.user.username == '' || this.user.username.length <= 3) {  
  39.       // alert 提醒用戶注意用戶名的正確性  
  40.       let alertUserNameError = this.alertCtrl.create({  
  41.         title: '用戶中心',  
  42.         subTitle: '輸入的用戶名格式不正確!',  
  43.         buttons: ['OK']  
  44.       });  
  45.   
  46.       alertUserNameError.present();  
  47.     } else {  
  48.       let loading = this.loadingCtrl.create({  
  49.         content: 'Please wait...',  
  50.         spinner: 'dots',  
  51.         duration: 3000, //單位是毫秒  
  52.       });  
  53.   
  54.       loading.present();  
  55.   
  56.       setTimeout(() => {  
  57.         loading.dismiss();  
  58.       }, 3000);  
  59.     }  
  60.   
  61.   }  
  62.   
  63. }  

 

五、Toast控件

  1. // 2. 使用 Toast 控件  
  2. let toast = this.toastCtrl.create({  
  3.   message: '輸入的用戶名格式不正確!',  
  4.   duration: 3000,  
  5. });  
  6. toast.present();  

 

六、Grid佈局

  1. <ion-row>  
  2.   <ion-col>  
  3.     <div class="textAlignRight marginTop10"><button clear>尚未帳號?點擊註冊</button></div>  
  4.   </ion-col>  
  5. </ion-row>  

 

七、 modal控件

  1. // 導入註冊頁面  
  2. import {Register} from '../contact/register';  

 

  1. // 打開註冊頁面  
  2. openRegisterPage() {  
  3.   let modal = this.modalCtrl.create(Register);  
  4.   modal.present();  
  5. }  

 

  1. import {Component} from '@angular/core';  
  2.   
  3. @Component({  
  4.   templateUrl: 'build/pages/contact/register.html'  
  5. })  
  6. export class Register {  
  7.   
  8. }  

 

八、 Toolbar控件

  1. <ion-toolbar>  
  2.   <ion-title>用戶註冊</ion-title>  
  3.   <ion-buttons end>  
  4.     <button (click)="dismiss()">  
  5.       <span showWhen="ios">取消</span>  
  6.       <ion-icon name="md-close" showWhen="android,windows"></ion-icon>  
  7.     </button>  
  8.   </ion-buttons>  
  9. </ion-toolbar>  

 

修改:

  1. <ion-header>  
  2.   <ion-toolbar>  
  3.     <ion-title>用戶註冊</ion-title>  
  4.     <ion-buttons end>  
  5.       <button (click)="dismiss()">  
  6.         <span showWhen="ios">取消</span>  
  7.         <ion-icon name="md-close" showWhen="android,windows"></ion-icon>  
  8.       </button>  
  9.     </ion-buttons>  
  10.   </ion-toolbar>  
  11. </ion-header>  
  12.   
  13.   
  14. <ion-content padding>  
  15.     <h5>Parameters passed:</h5>  
  16. </ion-content>  

 

九、 List控件

  1. <ion-list>  
  2.   <ion-item>  
  3.     <ion-avatar item-left><img src="../images/1.jpg" alt="頭像"></ion-avatar>  
  4.     <h2>哈哈</h2>  
  5.     <p>(ˇˍˇ) 想~</p>  
  6.   </ion-item>  
  7.   <ion-item>  
  8.     <ion-avatar item-left><img src="../images/2.jpg" alt="頭像"></ion-avatar>  
  9.     <h2>美女</h2>  
  10.     <p>(ˇˍˇ) 想~</p>  
  11.   </ion-item>  
  12. </ion-list>  

 

綁定數據源:

數據源的聲明

  1. // 通常數據源都是從 api 進行獲取,這裏咱們只是模擬一些已經取到了數據  
  2. public contacts = [  
  3.   {'contactid': 1, 'contactname': '夢小白', 'contacttext': '18888888888'},  
  4.   {'contactid': 2, 'contactname': '夢小白2', 'contacttext': '18888888888'},  
  5.   {'contactid': 3, 'contactname': '夢小白3', 'contacttext': '18888888888'},  
  6.   {'contactid': 4, 'contactname': '夢小白4', 'contacttext': '18888888888'},  
  7.   {'contactid': 5, 'contactname': '夢小白5', 'contacttext': '18888888888'},  
  8.   {'contactid': 6, 'contactname': '夢小白6', 'contacttext': '18888888888'},  
  9.   
  10.   {'contactid': 1, 'contactname': '夢小白7', 'contacttext': '18888888888'},  
  11.   {'contactid': 2, 'contactname': '夢小白8', 'contacttext': '18888888888'},  
  12.   {'contactid': 3, 'contactname': '夢小白9', 'contacttext': '18888888888'},  
  13.   {'contactid': 4, 'contactname': '夢小白10', 'contacttext': '18888888888'},  
  14.   {'contactid': 5, 'contactname': '夢小白11', 'contacttext': '18888888888'},  
  15.   {'contactid': 6, 'contactname': '夢小白12', 'contacttext': '18888888888'},  
  16. ];  

 

  1. <ion-list>  
  2.   <ion-item *ngFor="#contact of contacts" (click)="itemClick($event, contact)">  
  3.     <ion-avatar item-left><img src="../images/{{contact.contactid}}.jpg" alt="頭像"></ion-avatar>  
  4.     <h2>{{contact.contactname}}</h2>  
  5.     <p>{{contact.contacttext}}</p>  
  6.   </ion-item>  
  7. </ion-list>  

 

十、卡片佈局

  1. <ion-card>  
  2.   <ion-item>  
  3.     <ion-avatar item-left>  
  4.       <img src="../images/6.jpg" alt="頭像">  
  5.     </ion-avatar>  
  6.     <h2>Elon Musk</h2>  
  7.     <p>來自 iPhone 6s</p>  
  8.   </ion-item>  
  9.   <img src="../images/c1.jpg" alt="圖片">  
  10.   <ion-card-content>  
  11.     <p>我又發佈了一輛新車,上天入地捨我其誰?呵呵</p>  
  12.   </ion-card-content>  
  13.   <ion-item>  
  14.     <button primary clear item-left><ion-icon name="thumbs-up"></ion-icon><div>888 贊</div></button>  
  15.     <button primary clear item-left><ion-icon name="text"></ion-icon><div>600 評論</div></button>  
  16.     <ion-note item-right>  
  17.       1小時前  
  18.     </ion-note>  
  19.   </ion-item>  
  20. </ion-card>  

 

十一、navigation控件

  1. itemClick(event, contact) {  
  2.   //console.log(event);  
  3.   //console.dirxml(contact);  
  4.   //alert(contact.contactname);  
  5.   
  6.   this.navCtrl.push(ContactDetails, {item: contact});  
  7. }  

 

ContactDetails頁面

  1. /** 
  2.  * Created by Administrator on 2016/8/23 0023. 
  3.  */  
  4. import {Component} from '@angular/core';  
  5. import {NavParams} from 'ionic-angular';  
  6.   
  7. @Component({  
  8.   templateUrl: 'build/pages/about/contactdetails.html'  
  9. })  
  10. export class ContactDetails {  
  11.   private item = '';  
  12.   
  13.   constructor(public params: NavParams) {  
  14.     this.item = params.data.item;  
  15.   }  
  16. }  

 

  1. <ion-header>  
  2.   <ion-navbar>  
  3.     <ion-title>{{item.contactname}}</ion-title>  
  4.   </ion-navbar>  
  5. </ion-header>  
  6. <ion-content padding>  
  7.   {{item.contactname}} 的手機號碼爲:{{item.contacttext}}  
  8. </ion-content>  



 

(四)Cordova組件介紹

一、Image Picker組件

 

二、Geolocation組件

 

  1. // 獲取位置信息  
  2. Geolocation.getCurrentPosition().then((resp) => {  
  3.   console.log(resp.coords.latitude);  
  4.   console.log(resp.coords.longitude);  
  5. });  

 

 

三、Local Notifications組件

  1. // 本地提醒組件  
  2. LocalNotifications.schedule({  
  3.   text: '本地化提醒-您啓動了Ionic App',  
  4.   at: new Date(new Date().getTime() + 10000),  
  5.   sound: null  
  6. });  

 

(五)項目實戰

一、快速生成App圖標和啓動頁面

MakeAppicon

Ios.hvims.com

Launcher Icon Generator

iconhandbook.co.uk/reference/chart/android

 

二、使用localStorage存儲狀態信息

localStorage.setItem(key, value)

localStorage.getItem(key)

 

注:Modal頁面的關閉須要使用到ViewController中的dismiss方法。

 

三、Modal關閉後父頁面的概念和方法

 

四、Ionic中的網絡請求

跨域請求問題: http://enable-cors.org/ (固然在App中不會出現,只會在瀏覽器調試的過程當中出現)

 

  1. // 這裏是請求 API 的實現,注意跨域請求的問題,請參見 http://enable-cors.org/  
  2. this.http.get('http://xxx/account/Login?email=' + this.user.username + '&password=' + this.user.password)  
  3.   .subscribe(data => {  
  4.     let res = data.json();  
  5.     if(res.LoginStatus == 1) {  
  6.       localStorage.setItem('username', this.user.username);  
  7.       localStorage.setItem('logined', 'true');  
  8.       //自身 modal 隱藏  
  9.       this.viewCtrl.dismiss(this.user.username);  
  10.       loading.dismiss(); //登陸進度隱藏  
  11.     } else {  
  12.       let toast = this.toastCtrl.create({  
  13.         message: '登陸失敗!',  
  14.         duration: 2000,  
  15.       });  
  16.       toast.present();  
  17.     }  
  18.   
  19.   }, err => {  
  20.     let toast = this.toastCtrl.create({  
  21.       message: '登陸失敗!',  
  22.       duration: 2000,  
  23.     });  
  24.     toast.present();  
  25.   
  26.   });  

 

 

五、List中滑動刪除數據

  1. <ion-list>  
  2.   <ion-item-sliding *ngFor="#contact of contacts">  
  3.     <ion-item (click)="itemClick($event, contact)">  
  4.       <ion-avatar item-left><img src="images/{{contact.contactid}}.jpg" alt="頭像"></ion-avatar>  
  5.       <h2>{{contact.contactname}}</h2>  
  6.       <p>{{contact.contacttext}}</p>  
  7.     </ion-item>  
  8.     <ion-item-options>  
  9.       <button danger (click)="removeContact(contact)">  
  10.         <span padding><ion-icon name="trash"></ion-icon> 刪除</span>  
  11.       </button>  
  12.     </ion-item-options>  
  13.   </ion-item-sliding>  
  14. </ion-list>  

 

六、集成極光推送實現消息推送

// 設置客戶端的別名,用於定向接收消息的推送

window.plugins.jPushPlugin.setAlias(‘Client’ + loginResult.UserId);

 

// Client(只能是單一值):單獨的一臺設備綁定到jPush,就至關於設備的ID號碼,server端推送的時候只能推送到ID級別的。

 

var arrayObj = new Array(‘Tags’ + loginResult.UserId);

window.plugins.jPushPlugin.setTags(arrayObj);

//Tags:其實就是分組的意思,那麼這樣指定後,在用戶登陸的時候 分配一個分組名給用戶,那麼推送消息的時候,就能夠推送給這個分組。 應用場景:若是用戶有多個設備,而且這些設備上能夠同時登陸app,那麼咱們推送消息應該推送給這幾個設備。

 

//Client – 1,只是這一臺設備收到通知。

//Tag – 1,多臺設備都設置叫 Tag – 1。

 

七、iOS打包與AppStore上架

八、Android打包與發佈


參考學習:

https://babeljs.io

http://kangax.github.io/compat-table/es6/

https://github.com/driftyco

https://github.com/driftyco/ionic-preview-app/

http://www.typescriptlang.org/docs/

http://mhartington.io/post/ionic2-external-libraries/

 

http://www.imooc.com/article/14960

button是簡單的組件,包含文字和圖標以及不少屬性。

屬性

先無論按鈕的click事件,簡單的學習下控制按鈕樣式的一些屬性:

color

顧名思義,就是控制按鈕的顏色

<!-- Colors --> <button ion-button>Default</button> <button ion-button color="secondary">Secondary</button> <button ion-button color="danger">Danger</button> <button ion-button color="light">Light</button> <button ion-button color="dark">Dark</button>

多說明一句,上面使用的color,都是定義在src/theme/variables.scss文件中的

shape

有如下三種形狀:

  • full
  • block
  • round

前兩個我沒有發現什麼大的區別,好像都是撐滿父容器,有了解區別的還請指教
round顧名思義就是圓角按鈕的意思

 <!-- Shapes --> Shapes: <br> <table> <tr> <td> <button ion-button block>Block Button</button> </td> <td></td> </tr> </table> <button ion-button round>Round Button</button>

outline

使用該屬性將使按鈕只有邊框。

<!-- Outline --> <button ion-button full outline>Outline + Full</button> <button ion-button block outline>Outline + Block</button> <button ion-button round outline>Outline + Round</button>

Icons

在按鈕中增長圖標的屬性,有如下三個值:

  • icon-left : 圖標在文字左邊
  • icon-right :圖標在文字右邊
  • icon-only :只有圖標
 <!-- Icons --> <button ion-button icon-left> <ion-icon name="star"></ion-icon> Left Icon </button> <button ion-button icon-right> Right Icon <ion-icon name="star"></ion-icon> </button> <button ion-button icon-only> <ion-icon name="star"></ion-icon> </button>

Size

這個很簡單,就是制定按鈕的大小,有如下三個值:

  • Large
  • Default
  • small
    大,默認,小

    <!-- Sizes --> <button ion-button large>Large</button> <button ion-button>Default</button> <button ion-button small>Small</button>

高級用法

其實就是和angular2一塊兒使用動態設置樣式的用法
直接上示例:

<button ion-button [color]="isDanger?'danger':'primary'">advanced</button> <!-- Bind the color and round inputs to an expression --> <button ion-button [color]="myColor" [round]="isRound"> Secondary (Round) </button> <!-- Bind the color and clear inputs to an expression --> <button ion-button [color]="isSecondary ? 'secondary' : 'primary'" [clear]="isClear"> Primary (Clear) </button> <!-- Bind the color, outline and round inputs to an expression --> <button ion-button [color]="myColor2" [outline]="isOutline" [round]="isRound"> Dark (Solid + Round) </button>

在ts中以下使用:

export class ButtonPage { constructor(public navCtrl: NavController,public navParams:NavParams) { } isDanger: boolean = true; isSecondary: boolean = false; isRound: boolean = true; isOutline: boolean = false; isClear: boolean = true; myColor: string = 'secondary'; myColor2: string = 'dark'; }
相關文章
相關標籤/搜索