Ionic step by step (1)
刚接触 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
- 创建好页面之后,在app.module.ts 进行声明。
- 修改 app.component.ts,引入LoginPage,并修改根页面为 LoginPage。
- login.html(参考官方的组件:http://ionicframework.com/docs/components/#inputs)
<!--
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 -->

<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)的更多相关文章
- Step by step Dynamics CRM 2011升级到Dynamics CRM 2013
原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...
- Step by Step 创建一个新的Dynamics CRM Organization
原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...
- 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 ...
- Step by step Dynamics CRM 2013安装
原创地址:http://www.cnblogs.com/jfzhu/p/4008391.html 转载请注明出处 SQL Server可以与CRM装在同一台计算机上,也可安装在不同的计算机上.演示 ...
- Step by step 活动目录中添加一个子域
原创地址:http://www.cnblogs.com/jfzhu/p/4006545.html 转载请注明出处 前面介绍过如何创建一个域,下面再介绍一下如何在该父域中添加一个子域. 活动目录中的森林 ...
- SQL Server 维护计划实现数据库备份(Step by Step)(转)
SQL Server 维护计划实现数据库备份(Step by Step) 一.前言 SQL Server 备份和还原全攻略,里面包括了通过SSMS操作还原各种备份文件的图形指导,SQL Server ...
- 转:eclipse以及step into step over step return的区别
首先来讲一下step into step over step return的区别: step into就是单步执行,遇到子函数就进入并且继续单步执行:(F5) step over是在单步执行时,在函数 ...
- [转]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 ...
- EF框架step by step(7)—Code First DataAnnotations(2)
上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...
- EF框架step by step(6)—处理实体complex属性
上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理 这一篇介绍一下Code First方法中,实体Complex属性的处理.Complex属性是将一个对象做为另一个对象的属性.映射到数据库中 ...
随机推荐
- Java之集合(十二)TreeMap
转载请注明源出处:http://www.cnblogs.com/lighten/p/7411935.html 1.前言 本章介绍Map体系中的TreeMap,顾名思义,这个是一个树结构的Map.Tre ...
- 回退Ubuntu记录
前言 由于Ubuntu18经常出错,因而决定回退Ubuntu16,下面是记录回退问题及美化,以便以后需要. 问题总结 磁盘挂载 挂载其他磁盘分区时,提示错误"Metadata kept in ...
- libnetwork插件化网络功能
Docker把网络跟存储这两部分的功能实现都以插件化形式剥离出来,允许用户通过指令来选择不同的后端实现.这也是Docker希望构建围绕着容器的强大生态系统的一些积极的尝试.剥离出来的独立容器网络项目叫 ...
- mysql修改存储过程的权限
直接上代码 grant execute on procedure 表名.存储过程名(eg: student.find) to '用户名'@'host'(eg: 'volumelicense'@'%') ...
- 玩转mongodb(六):索引,速度的引领(普通索引篇)
数据库索引与书籍的索引类似,有了索引就不需要翻整本书,数据库可以直接在索引中查找,在索引中找到条目后,就可以直接跳到目标文档的位置,这可以让查找的速度提高几个数量级. 一.创建索引 我们在person ...
- IOC给程序带来的好处
IOC(inversion of control)的中文解释是“控制反转”或者“依赖注入”,它的实现目的是:我们可以通过配置文件来控制程序的流程,达到程序代码的优化.初学者往往弄不清楚为什么我们可以通 ...
- JAVA-6NIO之FileChannel
Java NIO中的FileChannel是一个连接到文件的通道.可以通过文件通道读写文件. FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下. 打开FileChannel 在使用F ...
- Python解析xml与JSON
xml与json是常用的文件交换格式,常用来表示网页的html则是xml的变种.解析xml和json在web开发中有着重要应用. DOM解析XML 文件对象模型(Document Object Mod ...
- setInterval与setTimeout的区别
在制作网页动态效果时,一定会遇到某些需求,要求某段程序等待多时时间后再开始执行,就像在我们的生活中一样,待会儿再开始做一件事.在JavaScript中主要通过定时器实现此类需求,本文将对定时器做一个概 ...
- 我所了解的Hibernate注解
一,首先需要导入支持注解开发的jar包: hibernate-annotations.jar hibernate-commons-annotations.jar (Hibernate中支持注解开发的j ...