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属性是将一个对象做为另一个对象的属性.映射到数据库中 ...
随机推荐
- 监督学习——决策树理论与实践(上):分类决策树
1. 介绍 决策树是一种依托决策而建立起来的一种树.在机器学习中,决策树是一种预测模型,代表的是一种对象属性与对象值之间的一种映射关系,每一个节点代表某个对象/分类,树中的每一个分叉路 ...
- Pycharm常用快捷键,以及设置
工欲善其事必先利其器,Python开发利器Pycharm常用快捷键以及配置如下,相信有了这些快捷键,你的开发会事半功倍 一 常用快捷键 编辑类: Ctrl + D 复制选定的区 ...
- 【链表】Add Two Numbers
题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...
- 【数组】Find Peak Element
题目: A peak element is an element that is greater than its neighbors. Given an input array where num[ ...
- 如何使用Android Studio提高App质量
Android Studio作为现在谷歌主推的Android开发功能,除了提供了大量的功能帮助快速开发Android代码之外,在代码质量控制方面也提供了很多工具,这些工具都放在Analyze菜单下, ...
- Fiddler Web Debugger是什么?(图文详解)
不多说,直接上干货! 1.为什么是Fiddler? 抓包工具有很多,小到最常用的web调试工具firebug,达到通用的强大的抓包工具wireshark. 见 Windows里安装wireshark或 ...
- 图解安卓-c++开发-通过java 调用c++ jni的使用
接着上一节 ,很多事情用java做,效率要差一点(尤其是游戏),所以要用c++来实现,那么java如何调用c++ 首先建议一个工程 HelloJni如下图: 按照默认的配置下一步,直到完成 . 如下图 ...
- Go语言学习笔记十一: 切片(slice)
Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...
- Linux skbuff注释笔记
SKB结构定义 /usr/src/linux/include/linux/skbuff.h sk_buff_head: struct sk_buff_head { //SKB的头结点 /* The ...
- 有序列表ol和定义列表dl,dt,dd
有序列表是一种讲究排序列表结构,使用<ol>标签定义,其中包含多个<li>列表项目.一般网页设计中,列表结构可以互用有序或者无序类表标签.但是,在强调项目排序栏目中,选用有序列 ...