创建一个OnsenUI2 + Angular + PhoneGap的框架模板
请参考以下链接以查看有关angular-onsenui2-webpack2的最新内容。
這篇文章是作為2016年Onsen UI Advent Calendar第11天的文章所創作的。
首先
从OnsenUI2和Angular2发布以来已经过了一段时间,大家有没有同时使用这两个工具?
当在使用Angular2时,由于很少有与之配套的示例教程,有时我们不知道该从哪里开始,或者在用Angular2开发手机应用程序时,我们需要参考一些内容。本文将介绍如何创建一个”OnsenUI2 + Angular2 + PhoneGap”的框架作为参考。
以下是开发环境的预期配置:
– 已安装 Node.js 4.x
– 已安装 PhoneGap/Cordova
请使用您喜欢的编辑器。
创建一个空的项目
用PhoneGap Create创建一个空项目。
$ phonegap create onsenui2-angular2
如果未安装PhoneGap/Cordova,请使用npm进行安装。
$ npm install -g phonegap
2. 安装依赖库
使用npm init命令创建一个空的package.json文件。
$ npm init -y
{
"name": "onsenui2-angular2",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
将所生成的package.json文件按照下面的方式进行修改。
改变的地方有三个。
scriptsにビルド用スクリプト追加
dependenciesにOnsenUI2とAngular2関連を追加
devDependenciesにTypeScriptとWebpack関連を追加
{
"name": "onsenui2-angular2",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"tsc": "tsc -p .",
"bundle": "webpack src/main.js www/js/bundle.js",
"build": "npm run tsc && npm run bundle",
"start": "static .",
"postinstall": "cpx node_modules/onsenui/**/* www/lib/onsenui",
"postbuild": "cpx src/**/*.html www/src"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@angular/common": "^2.2.4",
"@angular/compiler": "^2.2.4",
"@angular/core": "^2.2.4",
"@angular/platform-browser": "^2.2.4",
"@angular/platform-browser-dynamic": "^2.2.4",
"angular2-onsenui": "1.0.0-rc.2",
"core-js": "^2.4.1",
"onsenui": "^2.0.4",
"rxjs": "5.0.0-beta.12",
"zone.js": "0.6.21",
"cpx": "^1.5.0"
},
"devDependencies": {
"node-static": "^0.7.9",
"typescript": "^2.0.10",
"webpack": "^1.13.3"
}
}
由于最新版本的angular2-onsenui(RC3)存在pushPage动画无法播放的问题,所以这次我们采用了前一个版本。请迅速进行修正,Asial先生。
完成更改后,请使用npm install命令执行安装依赖库。
$ npm install
写index.html
我将修改www/index.html如下。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="format-detection" content="telephone=no" />
<meta name="msapplication-tap-highlight" content="no" />
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width" />
<!-- This is a wide open CSP declaration. To lock this down for production, see below. -->
<meta http-equiv="Content-Security-Policy" content="default-src * gap: ws: https://ssl.gstatic.com;style-src 'self' 'unsafe-inline' data: blob:;script-src * 'unsafe-inline' 'unsafe-eval' data: blob:;">
<link rel="stylesheet" href="./lib/onsenui/css/onsen-css-components-default.css">
<link rel="stylesheet" href="./lib/onsenui/css/onsenui.css">
<title>Hello world</title>
</head>
<body>
<my-app></my-app>
<script src="./lib/onsenui/js/onsenui.min.js"></script>
<script src="./js/bundle.js"></script>
</body>
</html>
哎呀?bundle.js是什么呢?(稍后会出现)
有一个叫做my-app的陌生标签,但这就是应用的主体。
4. 制作应用程序的内容
那么,我们就马上开始制作吧。
在新建的src/app.module.ts文件中定义应用程序的模块。
「模块」是将应用程序的功能集合在一起的东西。
我认为你可能会对@NgModule内(包括Angular2和OnsenUI2等库)以及组成应用程序各个页面的组件有所了解。
import {OnsenModule} from 'angular2-onsenui';
import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {AppComponent} from './components/app/app.component';
import {DefaultPageComponent} from './components/defaultPage/defaultPage.component';
import {PageComponent} from './components/page/page.component';
@NgModule({
imports: [OnsenModule],
declarations: [AppComponent, DefaultPageComponent, PageComponent],
entryComponents: [DefaultPageComponent, PageComponent],
bootstrap: [AppComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class AppModule {
}
接下来,我们将创建一个新的文件src/main.ts,并编写启动处理程序。
import 'core-js/shim';
import 'zone.js/dist/zone';
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {AppModule} from './app.module';
platformBrowserDynamic().bootstrapModule(AppModule);
5. 制作各组件
5.1组件
我們要創建初始畫面的組件。
這次我們將使用Onsen UI來創建頁面轉換的示例,只需編寫ons-navigator。
import {Component} from '@angular/core';
import {DefaultPageComponent} from '../defaultPage/defaultPage.component';
@Component({
selector: 'my-app',
template: '<ons-navigator [page]="page"></ons-navigator>'
})
export class AppComponent {
page = DefaultPageComponent
}
您在初始表示页面上指定了DefaultPageComponent。
我们将在DefaultPageComponent中创建要显示的第一个页面。
5.2 默认页面组件
DefaultPageComponent的内容如下。
pushPage函数的第一个参数是目标页面,第二个参数是要传递给目标页面的任意对象。
import {Component} from '@angular/core';
import {OnsNavigator, Params} from 'angular2-onsenui';
import {PageComponent} from '../page/page.component';
@Component({
selector: 'ons-page',
templateUrl: './src/components/defaultPage/defaultPage.template.html'
})
export class DefaultPageComponent {
constructor(private _navigator: OnsNavigator, private _params: Params) {
console.log('parameters:', _params.data);
}
push() {
// 遷移
this._navigator.element.pushPage(PageComponent, {data: {hoge: 'fuga'}});
}
}
在AppComponent中,我們直接編寫模板,但在進行分離到其他文件時,需要使用templateURL。
<ons-toolbar>
<div class="center">test</div>
</ons-toolbar>
<div class="content">
<div style="text-align: center; margin: 10px">
<ons-button (click)="push()">push</ons-button>
</div>
</div>
当您点击此模板内的ons-button时,将会跳转至下一页的PageComponent。
5.3 页面组件
除了包含”返回上一个画面”的处理之外,其他与DefaultPageComponent相同。
import {Component} from '@angular/core';
import {OnsNavigator, Params} from 'angular2-onsenui';
@Component({
selector: 'ons-page',
templateUrl: './src/components/page/page.template.html'
})
export class PageComponent {
constructor(private _navigator: OnsNavigator, private _params: Params) {
console.log('parameters:', _params.data);
}
push() {
this._navigator.element.pushPage(PageComponent, {animation: 'slide', data: {foo: 'bar'}});
}
pop() {
this._navigator.element.popPage();
}
}
<ons-toolbar>
<div class="left">
<ons-back-button>Back</ons-back-button>
</div>
<div class="center">test</div>
</ons-toolbar>
<div class="content">
<div style="text-align: center; margin: 10px">
<ons-button (click)="push()">push</ons-button>
<ons-button (click)="pop()">pop</ons-button>
</div>
</div>
将TypeScript进行转换(转译)
由于本次是用TypeScript编写的,因此需要将其转换为JavaScript,以便在普通浏览器上运行。
请在与package.json相同的目录中创建一个名为tsconfig.json的配置文件来进行转换设置,并保存。
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"lib": ["es6", "dom"],
"moduleResolution": "node",
"noImplicitAny": true,
"sourceMap": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true
},
"compileOnSave": false,
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules"
]
}
在 package.json 文件中已经写入了执行 TypeScript 转换所需的命令。现在就来立即执行试试看吧。
$ npm run build
使用浏览器确认
等编译完成后,试着在浏览器中确认一下。
启动应用程序服务器
$ phonegap serve
当您访问 http://localhost:3000,会显示您之前创建的应用程序。
最后
辛苦了!
这次的样本已经上传到 https://github.com/puku0x/onsenui2-angular2。
请在想要玩Angular2 + OnsenUI2时使用它。