ionic3 使用angular4,与ionic1区别比较大。这里记录一些框架架构。
其中AngularJS2的构架结构可以参考:
​​​AngularJS2学习笔记​

项目主体

Ionic3 学习笔记1 项目架构_angular


resources

放icon.png和splash.png
通过

ionic resources --icon
ionic resources --splash
ionic resources

用来生成桌面图标和启动界面


src 文件夹

项目主要在src中编码
Ionic3 学习笔记1 项目架构_ide_02

assets

assets 里放资源文件,主要是一些图片。
Ionic3 学习笔记1 项目架构_架构_03

app 目录

Ionic3 学习笔记1 项目架构_架构_04

这里主要需要修改的是app.module.ts

import { NgModule, ErrorHandler } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';
import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import { TabsPage } from '../pages/tabs/tabs';
import { AuthModule } from '../pages/auth/auth.module';
import { SettingModule } from '../pages/setting/setting.module';
import { DeviceModule } from '../pages/device/device.module';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import { HttpModule} from '@angular/http';
import { HttpService } from '../providers/HttpService';
import { ScreenOrientation } from "@ionic-native/screen-orientation";

@NgModule({
declarations: [
MyApp ,
TabsPage ,
HomePage,
],
imports: [
BrowserModule,
AuthModule,
SettingModule,
DeviceModule,
IonicModule.forRoot(MyApp),
HttpModule
],
bootstrap: [IonicApp],
entryComponents: [
MyApp ,
HomePage,
TabsPage
],
providers: [

StatusBar,
SplashScreen,ScreenOrientation,
{provide: ErrorHandler, useClass: IonicErrorHandler},HttpService
]
})
export class AppModule {}

pages 目录

所有模块的文件放在pages下
Ionic3 学习笔记1 项目架构_架构_05

其中 auth/user 模块,list、login、password、register是该模块下的几个功能,service中负责与http的通讯。
auth.module.ts 定义这个模块。

import { NgModule, ErrorHandler } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';
import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import { TabsPage } from '../pages/tabs/tabs';
import { AuthModule } from '../pages/auth/auth.module';
import { SettingModule } from '../pages/setting/setting.module';
import { DeviceModule } from '../pages/device/device.module';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import { HttpModule} from '@angular/http';
import { HttpService } from '../providers/HttpService';
import { ScreenOrientation } from "@ionic-native/screen-orientation";

@NgModule({
declarations: [
MyApp ,
TabsPage ,
HomePage,
],
imports: [
BrowserModule,
AuthModule,
SettingModule,
DeviceModule,
IonicModule.forRoot(MyApp),
HttpModule
],
bootstrap: [IonicApp],
entryComponents: [
MyApp ,
HomePage,
TabsPage
],
providers: [

StatusBar,
SplashScreen,ScreenOrientation,
{provide: ErrorHandler, useClass: IonicErrorHandler},HttpService
]
})
export class AppModule {}

provider

httpService

import {Injectable} from '@angular/core';
import {Http, Response, Headers, RequestOptions} from '@angular/http';
import 'rxjs/add/operator/toPromise';

@Injectable()
export class HttpService {

constructor(private http: Http) {
}

public get(url: string, paramObj: any) {
return this.http.get(url + this.toQueryString(paramObj))
.toPromise()
.then(res => this.handleSuccess(res.json()))
.catch(error => this.handleError(error));
}

public post(url: string, paramObj: any) {
let headers = new Headers({'Content-Type': 'application/x-www-form-urlencoded'});
return this.http.post(url, this.toBodyString(paramObj), new RequestOptions({headers: headers}))
.toPromise()
.then(res => this.handleSuccess(res.json()))
.catch(error => this.handleError(error));
}

public postBody(url: string, paramObj: any) {
let headers = new Headers({'Content-Type': 'application/json'});
return this.http.post(url, paramObj, new RequestOptions({headers: headers}))
.toPromise()
.then(res => this.handleSuccess(res.json()))
.catch(error => this.handleError(error));
}

private handleSuccess(result) {
if (result && !result.success) {//由于和后台约定好,所有请求均返回一个包含success,msg,data三个属性的对象,所以这里可以这样处理
console.info(result.msg);//这里使用ToastController
}
return result;
}

private handleError(error: Response | any) {
let msg = '请求失败';
if (error.status == 0) {
msg = '请求地址错误';
}
if (error.status == 400) {
msg = '请求无效';
console.log('请检查参数类型是否匹配');
}
if (error.status == 404) {
msg = '请求资源不存在';
console.error(msg+',请检查路径是否正确');
}
console.log(error);
console.info(msg);//这里使用ToastController
return {success: false, msg: msg};
}

/**
* @param obj 参数对象
* @return {string} 参数字符串
* @example
* 声明: var obj= {'name':'小军',age:23};
* 调用: toQueryString(obj);
* 返回: "?name=%E5%B0%8F%E5%86%9B&age=23"
*/
private toQueryString(obj) {
let ret = [];
for (let key in obj) {
key = encodeURIComponent(key);
let values = obj[key];
if (values && values.constructor == Array) {//数组
let queryValues = [];
for (let i = 0, len = values.length, value; i < len; i++) {
value = values[i];
queryValues.push(this.toQueryPair(key, value));
}
ret = ret.concat(queryValues);
} else { //字符串
ret.push(this.toQueryPair(key, values));
}
}
return '?' + ret.join('&');
}

/**
*
* @param obj
* @return {string}
* 声明: var obj= {'name':'小军',age:23};
* 调用: toQueryString(obj);
* 返回: "name=%E5%B0%8F%E5%86%9B&age=23"
*/
private toBodyString(obj) {
let ret = [];
for (let key in obj) {
key = encodeURIComponent(key);
let values = obj[key];
if (values && values.constructor == Array) {//数组
let queryValues = [];
for (let i = 0, len = values.length, value; i < len; i++) {
value = values[i];
queryValues.push(this.toQueryPair(key, value));
}
ret = ret.concat(queryValues);
} else { //字符串
ret.push(this.toQueryPair(key, values));
}
}
return ret.join('&');
}

private toQueryPair(key, value) {
if (typeof value == 'undefined') {
return key;
}
return key + '=' + encodeURIComponent(value === null ? '' : String(value));
}
}

constants

export const APP_SERVER_URL = 'http://192.168.1.5'

生成器

生成Page

ionic g page [PageName]

生成Component

ionic g component [ComponentName]

创建指令

ionic g directive [DirectiveName]

创建服务提供者

ionic g provider [ProviderName]

创建管道pipe

ionic g pipe [PipeName]