刚接触 ionic,一步一步学习,有错误的,望大家指出。

公式

Ionic = Cordova + Angular2 + ionic CSS

Cordova: 提供了使用 JavaScript 调用 Native 功能

安装

  • 全局安装 ionic 和 cordova
npm install -g cordova ionic
  • android,需安装 JDK 和 androidSDK、Gradle,并配置好环境变量

新建 ANDROID_HOME 变量名,并设置其值为 androidSDK 目录

在 Path 中添加 platform-tools 目录路径和 tools目录路径

在 Path 中添加 bin 目录路径

提示:这些都是跟后面打包android有关的,还有就是项目的路径里最好不要包括中文,会打包出错。

创建应用

ionic start myApp tabs

myApp: 项目名

tabs: 模板(默认tabs,还有其他的模板,如sidemenu)

遇到问题

  • Error: connect ETIMEOUT 192.30.255.121:443
  • 解决(使用vpn翻墙吧
ionic start myApp tabs --skip-npm
(我用的时候好像也没用,不会跳过npm install,所以不用加--skip-npm,到npm install时,手动停止,并进行cnpm install)
  • 运行时需要下载安装 @ionic/cli-plugin-ionic-angular
  • 解决
cnpm install --save-dev @ionic/cli-plugin-ionic-angular

知识点

  • ionic -h

    查看帮助

  • ionic info

    查看当前 Ionic 相关的环境变量

  • ionic cordova platform add ios

    添加 ios 项目

  • ionic cordova build ios

    同步到 ios 项目

  • ionic cordova emulate ios

    运行项目 apk

  • ionci cordova platform add android

    添加 android 项目

  • ionic cordova build android

    同步到 android 项目

  • ionic cordova emulate android

    运行项目 apk

创建登录页面

ionic g page Login
<!--
Generated template for the LoginPage page. See http://ionicframework.com/docs/components/#navigation for more info on
Ionic pages and navigation.
-->
<ion-header no-border> <ion-navbar transparent>
<!-- <ion-title>登录</ion-title> -->
</ion-navbar> </ion-header> <ion-content>
<ion-slides pager="false" autoplay="2000" loop="true" speed="1500" effect="fade">
<ion-slide class="slide-background swiper-no-swiping" *ngFor="let background of backgrounds" [ngStyle]="{'background-image': 'url(' + background +')'}"></ion-slide>
</ion-slides>
<div class="login-container">
<!-- logo -->
![](assets/logo/cat_logo.png)
<form [formGroup]="form" (ngSubmit)="login(form)">
<ion-item [ngClass]="{'has-invalid': form.controls.username.value && form.controls.username.invalid, 'has-valid': form.controls.username.value && form.controls.username.valid}">
<ion-label floating>手机号/邮箱</ion-label>
<ion-input type="text" name="username" formControlName="username"></ion-input>
</ion-item> <ion-item [ngClass]="{'has-invalid': form.controls.password.value && form.controls.password.invalid, 'has-valid': form.controls.password.value && form.controls.password.valid}">
<ion-label floating>密码</ion-label>
<ion-input type="password" name="password" formControlName="password"></ion-input>
</ion-item> <ion-item no-lines>
<ion-label text-right>记住密码</ion-label>
<ion-toggle name="remember" formControlName="remember" checked="false"></ion-toggle>
</ion-item> <div class="login-div">
<button ion-button class="login-btn" type="submit" [disabled]="!form.valid">登录</button>
</div>
<p (click)="openResetPassword()"><strong>忘记密码?</strong></p>
</form>
</div>
</ion-content>

这里不用angular2自带的验证类(ng-valid 和 ng-invalid)的原因是存在延迟

  • login.ts
import { Component, Inject } from '@angular/core';
import { FormBuilder, FormGroup, FormControl, Validators } from '@angular/forms';
import { NavController, NavParams, ModalController, LoadingController } from 'ionic-angular';
// 页面
import { TabsPage } from '../tabs/tabs'; /**
* Generated class for the LoginPage page.
*
* See http://ionicframework.com/docs/components/#navigation for more info
* on Ionic pages and navigation.
*/ @Component({
selector: 'page-login',
templateUrl: 'login.html',
})
export class LoginPage { public form: FormGroup;
public backgrounds: Array<string> = [
'assets/backgroundImages/background-4.jpg',
'assets/backgroundImages/background-5.jpg',
'assets/backgroundImages/background-6.jpg',
'assets/backgroundImages/background-7.jpg',
]; constructor(
@Inject(FormBuilder) fb: FormBuilder,
public navCtrl: NavController,
public navParams: NavParams,
public modalCtrl: ModalController,
public loadingCtrl: LoadingController,
) {
this.form = fb.group({
// 账号,手机或邮箱
username: ['', Validators.compose([Validators.required, Validators.pattern(/(^1(3[0-9]|4[57]|5[012356789]|7[01678]|8[0-9])\d{8}$)|(^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$)/)])],
password: ['', Validators.compose([Validators.required, Validators.pattern(/^\w{6,16}$/)])],
remember: false,
});
} ionViewDidLoad() {
console.log('ionViewDidLoad LoginPage');
} // 重置
openResetPassword() {
console.log('Reset password clicked');
} // 登录
login(form) {
this.presentLoading();
console.log(form.value);
setTimeout(() => {
// 页面跳转,可带数据
let tabs = this.modalCtrl.create(TabsPage);
tabs.present();
}, 3000);
} // 模拟等待
presentLoading() {
let loader = this.loadingCtrl.create({
content: '登录中,请稍后...',
duration: 3000
});
loader.present();
} }

使用 Storage

  • 确保安装了所需的依赖包,没有则安装
cnpm install --save @ionic/storage
  • 在 app.module.ts 引入
import { IonicStorageModule  } from '@ionic/storage';

// 此处省略一小段代码

@NgModule({
declarations: [
MyApp,
...pages,
],
imports: [
BrowserModule,
IonicModule.forRoot(MyApp),
IonicStorageModule.forRoot(),
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
...pages,
],
providers: [
StatusBar,
SplashScreen,
{provide: ErrorHandler, useClass: IonicErrorHandler}
]
})
export class AppModule {}
  • 在需要用到的组件中注入
import { Storage } from '@ionic/storage';
// 省略
@Component({
selector: 'page-login',
templateUrl: 'login.html',
})
export class LoginPage { public form: FormGroup; constructor(
@Inject(FormBuilder) fb: FormBuilder,
public storage: Storage,
public navCtrl: NavController,
public navParams: NavParams,
public modalCtrl: ModalController,
public loadingCtrl: LoadingController,
) {
this.form = fb.group({
// 账号,手机或邮箱
username: ['', Validators.compose([Validators.required, Validators.pattern(/(^1(3[0-9]|4[57]|5[012356789]|7[01678]|8[0-9])\d{8}$)|(^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$)/)])],
password: ['', Validators.compose([Validators.required, Validators.pattern(/^\w{6,16}$/)])],
remember: false,
});
} ionViewDidLoad() {
console.log('ionViewDidLoad LoginPage');
// 确保 storage
this.storage.ready().then(() => {
this.storage.get('userInfo').then((value) => {
if ( !value ) { return; }
let userInfo = JSON.parse(value);
this.form.setValue({
username: userInfo.username,
password: userInfo.password,
remember: userInfo.remember,
});
});
});
} // 重置
openResetPassword() {
console.log('Reset password clicked');
} // 登录
login(form) {
if ( form.value.remember ) {
const userInfo: Object = {
username: form.value.username,
password: form.value.password,
remember: form.value.remember,
};
this.storage.ready().then(() => {
this.storage.set('userInfo', JSON.stringify(userInfo));
});
}
this.presentLoading();
console.log(form.value);
setTimeout(() => {
let tabs = this.modalCtrl.create(TabsPage);
tabs.present();
}, 3000);
} // 模拟等待
presentLoading() {
let loader = this.loadingCtrl.create({
content: '登录中,请稍后...',
duration: 3000
});
loader.present();
} }

修改主题

app 主题样式表:src/theme/variables.scss

  • 颜色
$colors: (
primary: #488aff,
secondary: #32db64,
danger: #f53d3d,
light: #f4f4f4,
dark: #222,
twitter: #55acee, /* 自定义颜色 */
);

注意:在此定义会增加到所有组件中,即会增加 css文件的大小,从而会减低app速度。

  • 更进一步定义,基本色和对比色
$colors: (
primary: #488aff,
secondary: #32db64,
danger: #f53d3d,
light: #f4f4f4,
dark: #222,
twitter: (
base: #55acee,
contrast: #666,
),
);

Ionic step by step (1)的更多相关文章

  1. Step by step Dynamics CRM 2011升级到Dynamics CRM 2013

    原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...

  2. Step by Step 创建一个新的Dynamics CRM Organization

    原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...

  3. Step by step Install a Local Report Server and Remote Report Server Database

    原创地址:http://www.cnblogs.com/jfzhu/p/4012097.html 转载请注明出处 前面的文章<Step by step SQL Server 2012的安装 &g ...

  4. Step by step Dynamics CRM 2013安装

    原创地址:http://www.cnblogs.com/jfzhu/p/4008391.html 转载请注明出处   SQL Server可以与CRM装在同一台计算机上,也可安装在不同的计算机上.演示 ...

  5. Step by step 活动目录中添加一个子域

    原创地址:http://www.cnblogs.com/jfzhu/p/4006545.html 转载请注明出处 前面介绍过如何创建一个域,下面再介绍一下如何在该父域中添加一个子域. 活动目录中的森林 ...

  6. SQL Server 维护计划实现数据库备份(Step by Step)(转)

    SQL Server 维护计划实现数据库备份(Step by Step) 一.前言 SQL Server 备份和还原全攻略,里面包括了通过SSMS操作还原各种备份文件的图形指导,SQL Server  ...

  7. 转:eclipse以及step into step over step return的区别

    首先来讲一下step into step over step return的区别: step into就是单步执行,遇到子函数就进入并且继续单步执行:(F5) step over是在单步执行时,在函数 ...

  8. [转]Bootstrap 3.0.0 with ASP.NET Web Forms – Step by Step – Without NuGet Package

    本文转自:http://www.mytecbits.com/microsoft/dot-net/bootstrap-3-0-0-with-asp-net-web-forms In my earlier ...

  9. EF框架step by step(7)—Code First DataAnnotations(2)

    上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...

  10. EF框架step by step(6)—处理实体complex属性

    上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理 这一篇介绍一下Code First方法中,实体Complex属性的处理.Complex属性是将一个对象做为另一个对象的属性.映射到数据库中 ...

随机推荐

  1. 广州.NET俱乐部简介

    广州.NET俱乐部 简介 广州 .NET 俱乐部自2018年底重新在广州地区活跃. 目前已经成功在广州.深圳.苏州和东莞组织并参与了多长线下技术交流活动. 已经有超过1200+人加入了俱乐部线上社区. ...

  2. Nodejs学习笔记(十一)—数据采集器示例(request和cheerio)

    写在之前 很多人都有做数据采集的需求,用不同的语言,不同的方式都能实现,我以前也用C#写过,主要还是发送各类请求和正则解析数据比较繁琐些,总体来说没啥不好的,就是效率要差一些, 用nodejs写采集程 ...

  3. js拼图

    ;(function($){ function arrayIndexOf(r, num){ if( Array.prototype.indexOf ){ return r.indexOf(num); ...

  4. 美化checkbox多选框

    看到那些UI框架都是有美化checkbox多选框的,不过大多是图片或者是字体图标.于是就利用label仿了个多选框效果. <!DOCTYPE html> <html lang=&qu ...

  5. Android之网络丢包事件

    原文链接 http://www.litrin.net/2013/03/01/android%E4%B9%8B%E7%BD%91%E7%BB%9C%E4%B8%A2%E5%8C%85%E4%BA%8B% ...

  6. ZOJ 1586 QS Network(Kruskal算法求解MST)

    题目: In the planet w-503 of galaxy cgb, there is a kind of intelligent creature named QS. QScommunica ...

  7. 存储树形的数据表转为Json

    /// <summary> /// 根据DataTable生成Json树结构 /// </summary> /// <param name="tabel&quo ...

  8. PHP数组基本的操作方法

    1.数组操作的基本函数 数组的键和值: array_values($arr);获得数组的值 array_keys($arr);获得数组的键名 array_flip($arr);数组中的值与键名互换(如 ...

  9. ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用

    Ajax的全名为:Asynchronous Javascript And XML(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术.Ajax技术首先向Web服务器发送 ...

  10. java SE 入门之语言与环境(第一篇)

    Javase的语言与开发环境Keke2016年03月08日 Java属于-Oracle公司(甲骨文)创始人:Gosling1995年诞生1998年12月发布jdk1.22002年2月发布:jdk1.4 ...