移动应用框架 ionic2 自学须知的基本知识点

官方文档:http://ionicframework.com/docs/v2/


        Ionic(ionicframework)一款接近原生的Html5移动App开发框架。

IONIC 是目前最有潜力的一款 HTML5 手机应用开发框架。通过 SASS 构建应用程序,它提供了很多 UI 组件来帮助开发者开发强大的应用。 它使用 JavaScript MVVM 框架和AngularJS 来增强应用。提供数据的双向绑定,使用它成为 Web 和移动开发者的共同选择。Ionic是一个专注于用WEB开发技术,基于HTML5创建类似于手机平台原生应用的一个开发框架。Ionic框架的目的是从web的角度开发手机应用,基于PhoneGap的编译平台,可以实现编译成各个平台的应用程序。

注意:这里讲的是ionic2的知识点,毕竟它与ionic 1.0有着较显著的区别。

Ionic2的版本更新介绍:https://github.com/driftyco/ionic/blob/master/CHANGELOG.md

Ionic2 Iclic Labs:http://www.icliclabs.com/

Ionic2 项目参考:market.ionic.io

Ionic2的文档学习:来自 yan_xiaodi 的 Ionic2系列——Ionic 2 Guide 官方文档中文版

Ionic2 APP启动慢? 参考: Ionic 2 speed up boot time?

Ionic2 远程调试:Ionic 项目调试工具

icon和splash的生成:Icon and Splash Screen Image Generation

ionic2的主题切换实现:User-Selected Style Themes in an Ionic 2 Application

ionic2处理安卓物理键返回退出应用:ionic2实战-完美处理安卓硬件返回按钮

Ionic3的页面懒加载:Ionic 3 Lazy Loading

(一)Ionic 的安装与运行

 

1、 下载安装 node.js,可以在命令行中使用node–v命令查看当前安装的node.js的版本;

2、 使用 npm install ionic –g命令可以安装Ionic,不过需要注意的是此时安装的版本为Ionic 1.0版本。可以使用npm install ionic@beta–g安装beta版本,如可以使用npm installionic@2.0.0-beta.22 –g安装beta.22版本;

2017-02-17 现在直接npm install ionic -g即可安装到 Ionic2

3、 安装Ionic 后,可以使用 ionic start ionicdemo --v2初始化一个空项目,默认采用tabs template作为初始化项目的模板,如果需要其他的模板,那么在项目名称后面添加上对应的模板名称即可,如:ionic start ionicdemo tutorial --v2;(--v2参数明确了使用2.0版本去初始化项目)

4、 使用 ionic serve可以运行Ionic项目;

5、 使用 ionic platform add androidionic platform add ios命令可以添加两个手机平台的部署文件(使用ionicplatform list 命令可以查看当前的平台信息);

6、 在项目中添加了两个平台的部署文件,可以通过platform文件夹下进行查看,相应地,在Xcode导入ios部署文件或在Android studio导入Android部署文件,可以进行相应地真机调试;


注:

1)更新 node_modules/ionic-native 到最新的命令:

npm i --save ionic-native@latest
or

cnpm i --save ionic-native@latest
有时可能遇到 ionic-native中插件不能使用的问题,可能是由于当前项目中ionic-native版本过低,我们需要将其更新到最新版本。需要注意:更新到最新版本后,可能出现其他问题哦~

2)查看ionic-native版本:

npm list ionic-native
or

cnpm list ionic-native

3)在ionic start项目时,可能出现如下错误:

Error with start undefined

Error Initializing app: There was an error with the spawned command: npminstall

There was an error with the spawned command: npminstall

Caught exception:

undefined


解决方案:

After this error, run npm install , if get some error related to git , than follow below steps, it resolved for me:
Go to https://git-for-windows.github.io/ and install git
than open git cmd
run below command: 
git config --global url."https://".insteadOf git://



(二)Ionic页面的生命周期

// 页面被加载完成后调用的函数,切换页面时并不会进行重新加载,因为有cache的存在
onPageLoaded() {
  console.log('page 1: page loaded.');
}

// 页面即将进入的时候
onPageWillEnter() {
  // 在这里可以做页面初始化的一些事情
  console.log('page 1: page will enter.');
}

// 页面已经进入的时候
onPageDidEnter() {
  console.log('page 1: page did enter.');
}

// 页面即将离开的时候
onPageWillLeave() {
  console.log('page 1: page will leave.');
}

// 页面已经离开的时候
onPageDidLeave() {
  console.log('page 1: page did leave.');
}

// 从 DOM 中移除的时候执行的生命周期
onPageWillUnload() {

}

// 从 DOM 中移除执行完成的时候
onPageDidUnload() {

}

(三)Ionic组件

1Tab控件

图标:http://ionicframework.com/docs/v2/ionicons/ 

tabs.html

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

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


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


默认首先进入第三个tab页面:

Html控制

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

JS控制

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

import {Component} from '@angular/core';
import {HomePage} from '../home/home';
import {AboutPage} from '../about/about';
import {ContactPage} from '../contact/contact';

import {Tabs} from 'ionic-angular';
import {Injectable, ViewChild} from '@angular/core';

@Component({
  templateUrl: 'build/pages/tabs/tabs.html'
})
export class TabsPage {
  @ViewChild('mainTabs') tabRef: Tabs;

  private tab1Root: any;
  private tab2Root: any;
  private tab3Root: any;

  constructor() {
    // this tells the tabs component which Pages
    // should be each tab's root Page
    this.tab1Root = HomePage;
    this.tab2Root = AboutPage;
    this.tab3Root = ContactPage;
  }

  ionViewDidEnter() {
    this.tabRef.select(2);
  }
}

2Button控件

<button>Basic Button</button>
<button gray>Gray Button</button>
<button danger>Danger Button</button>
<button outline>Outline Button</button>
<button clear>Clear Button</button>
<button round>Round Button</button>
<button block>Block Button</button>
<button small>Small Button</button>
<button large>Large Button</button>
<button>
  <ion-icon name="home"></ion-icon>
  Button
</button>
<button>
  Button
  <ion-icon name="home"></ion-icon>
</button>
<button>
  <ion-icon name="home"></ion-icon>
</button>


3Input控件

<ion-list>
  <ion-item>
    <ion-label floating>用户名</ion-label>
    <ion-input type="text" value="" [(ngModel)]="user.username"></ion-input>
  </ion-item>
  <ion-item>
    <ion-label stacked>密码</ion-label>
    <ion-input type="password" value="" [(ngModel)]="user.password"></ion-input>
  </ion-item>
</ion-list>
<button block (click)="showFill()">登录</button>

export class ContactPage {
  public user = {
    username: 'parry',
    password: ''
  };

  constructor(private navCtrl: NavController) {

  }

  showFill() {
    alert(this.user.username);
    console.log(this.user.password);
  }
}

4Loading控件、Alert控件

import {Component} from '@angular/core';
import {NavController, LoadingController, AlertController} from 'ionic-angular';

@Component({
  templateUrl: 'build/pages/contact/contact.html'
})
export class ContactPage {
  public user = {
    username: 'parry',
    password: ''
  };

  constructor(private navCtrl: NavController,
              private loadingCtrl: LoadingController,
              private alertCtrl: AlertController) {
    this.navCtrl = navCtrl;
  }

  showFill() {
    alert(this.user.username);
    console.log(this.user.password);
  }

  login() {
    /*// 创建 loading 窗口,模拟3秒后登录成功, loading 窗口消失
    let loading = Loading.create({
      content: '正在登录...',
      duration: 3000, //单位是毫秒
    });

    this.navCtrl.present(loading);

    // 真实的逻辑应该是:去请求登录的 API,返回结果后,进行loading窗口的隐藏
    setTimeout(() => {
      loading.dismiss();
    }, 3000);*/

    if(this.user.username == '' || this.user.username.length <= 3) {
      // alert 提醒用户注意用户名的正确性
      let alertUserNameError = this.alertCtrl.create({
        title: '用户中心',
        subTitle: '输入的用户名格式不正确!',
        buttons: ['OK']
      });

      alertUserNameError.present();
    } else {
      let loading = this.loadingCtrl.create({
        content: 'Please wait...',
        spinner: 'dots',
        duration: 3000, //单位是毫秒
      });

      loading.present();

      setTimeout(() => {
        loading.dismiss();
      }, 3000);
    }

  }

}

5Toast控件

// 2. 使用 Toast 控件
let toast = this.toastCtrl.create({
  message: '输入的用户名格式不正确!',
  duration: 3000,
});
toast.present();

6Grid布局

<ion-row>
  <ion-col>
    <div class="textAlignRight marginTop10"><button clear>还没有账号?点击注册</button></div>
  </ion-col>
</ion-row>

7、 modal控件

// 导入注册页面
import {Register} from '../contact/register';

// 打开注册页面
openRegisterPage() {
  let modal = this.modalCtrl.create(Register);
  modal.present();
}

import {Component} from '@angular/core';

@Component({
  templateUrl: 'build/pages/contact/register.html'
})
export class Register {

}

8、 Toolbar控件

<ion-toolbar>
  <ion-title>用户注册</ion-title>
  <ion-buttons end>
    <button (click)="dismiss()">
      <span showWhen="ios">取消</span>
      <ion-icon name="md-close" showWhen="android,windows"></ion-icon>
    </button>
  </ion-buttons>
</ion-toolbar>

修改:

<ion-header>
  <ion-toolbar>
    <ion-title>用户注册</ion-title>
    <ion-buttons end>
      <button (click)="dismiss()">
        <span showWhen="ios">取消</span>
        <ion-icon name="md-close" showWhen="android,windows"></ion-icon>
      </button>
    </ion-buttons>
  </ion-toolbar>
</ion-header>


<ion-content padding>
    <h5>Parameters passed:</h5>
</ion-content>

9、 List控件

<ion-list>
  <ion-item>
    <ion-avatar item-left><img src="../images/1.jpg" alt="头像"></ion-avatar>
    <h2>哈哈</h2>
    <p>(ˇˍˇ) 想~</p>
  </ion-item>
  <ion-item>
    <ion-avatar item-left><img src="../images/2.jpg" alt="头像"></ion-avatar>
    <h2>美女</h2>
    <p>(ˇˍˇ) 想~</p>
  </ion-item>
</ion-list>

绑定数据源:

数据源的声明

// 一般数据源都是从 api 进行获取,这里我们只是模拟一些已经取到了数据
public contacts = [
  {'contactid': 1, 'contactname': '梦小白', 'contacttext': '18888888888'},
  {'contactid': 2, 'contactname': '梦小白2', 'contacttext': '18888888888'},
  {'contactid': 3, 'contactname': '梦小白3', 'contacttext': '18888888888'},
  {'contactid': 4, 'contactname': '梦小白4', 'contacttext': '18888888888'},
  {'contactid': 5, 'contactname': '梦小白5', 'contacttext': '18888888888'},
  {'contactid': 6, 'contactname': '梦小白6', 'contacttext': '18888888888'},

  {'contactid': 1, 'contactname': '梦小白7', 'contacttext': '18888888888'},
  {'contactid': 2, 'contactname': '梦小白8', 'contacttext': '18888888888'},
  {'contactid': 3, 'contactname': '梦小白9', 'contacttext': '18888888888'},
  {'contactid': 4, 'contactname': '梦小白10', 'contacttext': '18888888888'},
  {'contactid': 5, 'contactname': '梦小白11', 'contacttext': '18888888888'},
  {'contactid': 6, 'contactname': '梦小白12', 'contacttext': '18888888888'},
];

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

10、卡片布局

<ion-card>
  <ion-item>
    <ion-avatar item-left>
      <img src="../images/6.jpg" alt="头像">
    </ion-avatar>
    <h2>Elon Musk</h2>
    <p>来自 iPhone 6s</p>
  </ion-item>
  <img src="../images/c1.jpg" alt="图片">
  <ion-card-content>
    <p>我又发布了一辆新车,上天入地舍我其谁?呵呵</p>
  </ion-card-content>
  <ion-item>
    <button primary clear item-left><ion-icon name="thumbs-up"></ion-icon><div>888 赞</div></button>
    <button primary clear item-left><ion-icon name="text"></ion-icon><div>600 评论</div></button>
    <ion-note item-right>
      1小时前
    </ion-note>
  </ion-item>
</ion-card>

11navigation控件

itemClick(event, contact) {
  //console.log(event);
  //console.dirxml(contact);
  //alert(contact.contactname);

  this.navCtrl.push(ContactDetails, {item: contact});
}

ContactDetails页面

/**
 * Created by Administrator on 2016/8/23 0023.
 */
import {Component} from '@angular/core';
import {NavParams} from 'ionic-angular';

@Component({
  templateUrl: 'build/pages/about/contactdetails.html'
})
export class ContactDetails {
  private item = '';

  constructor(public params: NavParams) {
    this.item = params.data.item;
  }
}

<ion-header>
  <ion-navbar>
    <ion-title>{{item.contactname}}</ion-title>
  </ion-navbar>
</ion-header>
<ion-content padding>
  {{item.contactname}} 的手机号码为:{{item.contacttext}}
</ion-content>


(四)Cordova组件介绍

1Image Picker组件

2Geolocation组件

// 获取位置信息
Geolocation.getCurrentPosition().then((resp) => {
  console.log(resp.coords.latitude);
  console.log(resp.coords.longitude);
});

3Local Notifications组件

// 本地提醒组件
LocalNotifications.schedule({
  text: '本地化提醒-您启动了Ionic App',
  at: new Date(new Date().getTime() + 10000),
  sound: null
});

(五)项目实战

1、快速生成App图标和启动页面

MakeAppicon

Ios.hvims.com

Launcher Icon Generator

iconhandbook.co.uk/reference/chart/android


2、使用localStorage存储状态信息

localStorage.setItem(key, value)

localStorage.getItem(key)

 

注:Modal页面的关闭需要使用到ViewController中的dismiss方法。

 

3Modal关闭后父页面的概念和方法

 

4Ionic中的网络请求

跨域请求问题: http://enable-cors.org/ (当然在App中不会出现,只会在浏览器调试的过程中出现)

// 这里是请求 API 的实现,注意跨域请求的问题,请参见 http://enable-cors.org/
this.http.get('http://xxx/account/Login?email=' + this.user.username + '&password=' + this.user.password)
  .subscribe(data => {
    let res = data.json();
    if(res.LoginStatus == 1) {
      localStorage.setItem('username', this.user.username);
      localStorage.setItem('logined', 'true');
      //自身 modal 隐藏
      this.viewCtrl.dismiss(this.user.username);
      loading.dismiss(); //登录进度隐藏
    } else {
      let toast = this.toastCtrl.create({
        message: '登录失败!',
        duration: 2000,
      });
      toast.present();
    }

  }, err => {
    let toast = this.toastCtrl.create({
      message: '登录失败!',
      duration: 2000,
    });
    toast.present();

  });

5List中滑动删除数据

<ion-list>
  <ion-item-sliding *ngFor="#contact of contacts">
    <ion-item (click)="itemClick($event, contact)">
      <ion-avatar item-left><img src="images/{{contact.contactid}}.jpg" alt="头像"></ion-avatar>
      <h2>{{contact.contactname}}</h2>
      <p>{{contact.contacttext}}</p>
    </ion-item>
    <ion-item-options>
      <button danger (click)="removeContact(contact)">
        <span padding><ion-icon name="trash"></ion-icon> 删除</span>
      </button>
    </ion-item-options>
  </ion-item-sliding>
</ion-list>

6、集成极光推送实现消息推送

// 设置客户端的别名,用于定向接收消息的推送

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


7iOS打包与AppStore上架

8Android打包与发布


参考学习:

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/



  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现了首页商品分类,广告栏,分类菜单 <ion-view view-title="阿哥汇商城" hide-nav-bar="true"> <ion-header-bar align-title="left" class="bar-balanced"> <div class="buttons"> <!--ui-sref="category"--> <div class="button icon-left ion-navicon button-clear" ng-click="toggleCategory()"></div> <!--<div class="button icon-left ion-navicon button-clear" ng-click="modal.show()"></div>--> </div> <label class="item-input-wrapper" ui-sref="search" style="height: 33px;"> <i class="icon ion-ios-search placeholder-icon" style="margin: 20px 0px;color: #BBBBBB"></i> <input class="small-text" type="search" ng-model="searchStr" style="background: transparent;width: 100%" placeholder="请输入商品名称"> </label> <div class="buttons"> <div class="button icon-right ion-ios-cart-outline button-clear" ng-click="toCart()"></div> <i class="badge icon-right assertive" style="height:15px;font-size: 10px;margin-left: -10px;top: -8px;padding:0px 5px;float: inherit;background: #FFFFFF" ng-show="true">{{cartSize}}</i> </div> </ion-header-bar> <ion-content scroll="false" ng-show="isCategory" style="height:100%;background-color: rgba(0, 0, 0, 0.50);z-index: 900"> <div style="height: 85%;margin-bottom: 50px;"> <div class="row" style="width: 100%;height:100%;margin: 0;padding: 0;"> <div class="col-50" style="padding: 0;height: 100%;"> <div class="list" style="padding: 0"> <div class="item item-icon-right item-icon-left" ng-repeat="item in categoryAndProducts" ng-click="selectItem(item, $index)" ng-class="{active: activeItem == item}"> <i class="icon balanced" ng-class="iconArr[$index]"></i> {{item.cat_name}} <i class="icon ion-ios-arrow-right balanced" style="font-size: 24px;align-items:center"></i> </div> </div> </div> <div class="col-50" style="padding: 0;height: 100%;"> <div class="list" style="padding: 0;background: #dedede"> <div class="item active-item item-button-right" ng-repeat="cat in subCategory" ng-click="selectCategory(cat.cat_id)" style="background: #dedede"> {{cat.cat_name}} <button class="button button-clear">{{cat.goods_total}}ddd</button> </div> </div> </div> </div> </div> </ion-content> <ion-content class="false" overflow-scroll="true" style="overflow: hidden;"> <!-- <ion-refresher> 下拉刷新指令 --> <ion-refresher pulling-text="下拉刷新" on-refresh="doRefresh()" spinner="android"></ion-refresher> <ion-slide-box active-slide="myActiveSlide" auto-play="true" does-continue="true" show-pager="true" slide-interval="2000" ng-if="ads" style="height: 108px;"> <ion-slide ng-repeat="ad in ads"> <div class="box blue"> <!--<h1>BLUE</h1>--> <img src="{{APPCONFIG.picURL}}/{{ad.src}}" style="width: 100%;height:inherit"> </div> </ion-slide> </ion-slide-box> <ion-list style=""> <ion-item style="padding: 0px;border-color:#FFF"> <!--<h2>{{item.id}}</h2>--> <div style="height: auto; width:100%;padding: 0"> <div class="row row-center" style="height: 40px;width: 100%;padding: 0;font-size: 16px" onclick="save($index)"> <i class="icon" style="width: 4px;height: 50%;background: {{colors[0]}}"></i> <div class="padding" style="width: 100%"><h2 style="font-size: 20px;color:{{colors[0]}}">热门店铺</h2></div> 更多<i class="icon icon-right ion-ios-arrow-right" style="font-size: 24px;margin-right: 20px;margin-left: 3px"></i> </div> <div class="row row-wrap" style="height:auto; width: 100%;padding: 0;margin-top: 0 "> <div class="col col-33 img" ng-repeat="image in hotsuppliers" style="margin: 0px;padding: 7px auto;height: 60px"> <img ng-src="{{APPCONFIG.picURL}}{{image.logo}}" style="height: 45px;width: 90px"/> </div> </div> <div style="background: #F3F3F3;height: 10px;width: 100%"></div> </div> </ion-item> <ion-item collection-repeat="item in categoryAndProducts" style="padding: 0;border-color:#FFF"> <!--<h2>{{item.id}}</h2>--> <div style="height: auto; width:100%;padding: 0"> <div class="row row-center" style="height: 40px;width: 100%;padding: 0;font-size: 16px" ng-click="selectCategory(item.cat_id)"> <i class="icon" style="width: 4px;height: 50%;background: {{colors[(item.cat_id%5)]}}"></i> <div class="padding" style="width: 100%"><h2 style="color: {{colors[(item.cat_id%5)]}};font-size: 20px"> {{item.cat_name}}</h2></div> 更多<i class="icon icon-left ion-ios-arrow-right" style="font-size: 24px;margin-right: 20px;margin-left: 3px"></i> </div> <div class="row row-center" style="padding: 0;margin-top: 0"> <div class="col-33" ng-repeat="product in item.goods" style="padding: 5px" ng-click="goProductDetail(product.goods_id)"> <div class="img" style="width: 100%"> <img class="item-product-img" ng-src="{{APPCONFIG.picURL}}/{{product.goods_thumb}}" style="width: 90px;height: 90px"> <div class="desc" style="text-overflow: ellipsis;white-space:nowrap; overflow:hidden;font-size: 16px;margin-top: 5px"> {{product.goods_name}} </div> <div style="background: #DEDFE0;height: 1px;margin: 2px"></div> <div class="desc assertive" style="text-overflow: ellipsis;overflow:hidden;font-size: 16px"><b>{{product.price | currency:"¥"}}</b></div> </div> </div> </div> <div style="background: #F3F3F3;height: 10px;width: 100%"></div> </div> </ion-item> </ion-list> </ion-content>
IONIC 功能全演示 ===================== - 使用Ionic提供的UI 组件。Ionic本身是致力于建立统一的移动混合app构建平台,核心基础是Angular+Cordova。 - 通过Angular指令封装,以及预定义的CSS,提供了开箱即用的HTML5 Mobile组件。 - 构建与开发支持,能够直接运行www目录下的index.html进行开发调试。同时也支持发布人员利用gulp构建输出到dist目录 - 利用gulp,同样演示了单元测试以及场景测试。 - [在线演示,内有地址二维码,可手机浏览](http://1.thm1118.sinaapp.com/static/ionic/www/index.html) ## 预览 ![信息卡片](screenshot/card.png) ![下拉刷新](screenshot/pullrefress.png) ![表单元素](screenshot/form.png) ![菜单](screenshot/menu.png) ![列表左滑按钮](screenshot/option.png) ![弹出层](screenshot/pop.png) ![tab](screenshot/tab.png) ![幻灯](screenshot/slide.png) ![图片水平滚动](screenshot/hscroll.png) ![毛玻璃效果](screenshot/blure.png) ![2000条数据搜索](screenshot/search.png) ![输入自动完成](screenshot/autocomplete.png) ![列表自动分组](screenshot/autogroup.png) ![媒体相册](screenshot/galaxy.png) ![chartjs统计图](screenshot/chartjs.png) ![百度统计图](screenshot/echat.png) ![图片延时加载](screenshot/imageload.png) ## 基础环境 纯webapp运行或演示,只需要一个 web server部署即可。 ## 目录结构说明 - www 目录:源码目录 - dist目录:构建输出目录 ## 利于开发,测试和打包部署的nodejs环境 简单开发可以不依赖nodejs环境。但是有了基于nodejs的javascript完整开发周期环境,会极大提升开发效率,保障质量。 - nodejs 最新版。 - 有些node包的安装需要c++编译,x86版本只需要 x86的C++编译器,windows上的x64 c++编译器需要特别设置。 - npm 会很慢,要么使用代理,要么使用国内镜像,比如 [淘宝镜像](http://npm.taobao.org/) , 使用淘宝镜像后,npm命令需要替换成cnpm命令。 - `npm install -g gulp` - `npm install -g ionic` - 如需编译sass的话,安装 [ruby](https://www.ruby-lang.org/zh_cn/),再执行 `gem install sass`(如遇到ssl错误,修改为http源:gem source -a http://rubygems.org/) - `npm install -g node-gyp` - 有的node包依赖python编译,安装 [python2.7](https://www.python.org/) - c++编译环境[MSVStudio 免费版](https://www.visualstudio.com/downloads/download-visual-studio-vs#d-express-windows-desktop).。注意根据studio不同版本指定 --msvs_version=2013 选项 - 安装项目开发依赖包,在项目根目录下运行 `npm install` ### “所见即所得”式开发 - 在项目根目录下运行 `ionic serve`,即可在www目录下开展“所见即所得”的方式开发 - 另外一种方式,在webstorm里对index.html 按debug运行,同样是“所见即所得”的方式开发 ### CROS支持 - 生产环境的 CROS支持要么使用jsonp技术,要么在服务端设置代理。 - 而开发环境下要么 基于不安全做法,服务端api 设置头`Access-Control-Allow-Origin:*" `,要么按如下便捷设置: 基于`ionic serve`, 可以在开发时使用本地代理。ionic.project 内设

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值