利用Angular2 + Ionic3开发IOS应用实例教程


Posted in Javascript onJanuary 15, 2018

从 Angular1 到 Angular2

Angular2 作为著名前端 MVVM 架构 Angular1 的继承者,从一定程度上说,引领了新一代 Web 前端开发技术的革新。从最新版的 ember.js, react.js, vue.js 中,可以看到这几种技术相互借鉴,取长补短,最终向一种技术方向演进。

组件化技术的崛起

Angular1 也有组件,叫另外一个名字:指令。在 Angular1 中,指令是 DOM 元素紧密结合的一段包含控制逻辑、数据管理的代码。在指令中,我们可以清楚的看到 Angular1 对于 Jquery/DOM 技术的使用,以及手动对 Angular 组件进行生命周期的管理。要知道,这些在一般的 Angular 控制器/页面模板的开发中,是不用被关心的。

Angular2 把组件扩大化,使这种类似于指令化的开发应用到页面开发中。这样有什么好处呢?

  • 增加了开发人员页面开发的灵活性
  • 使用新的文件引用技术,这点我们在 Webpack 的革新中具体阐述
  • css 的分离化管理

如果了解其他的开发技术,可以发现组件化渐渐的统治了前端开发领域。从 ember.js,vue.js,到 React.js,组件化技术都被广泛应用。

从 grunt/gulp 到 Webpack 的技术革新

Task runner, 从最早的 grunt,到 gulp,是服务于应用程序的一些控制程序。有帮助开发人员进行开发、运行单元集成测试、帮助产品发布等等一系列功能,一般我们依赖于第三方的程序来实现,例如 gulp。但是 npm 本身就有 task runner 的功能,如清单 1,scripts 中包含了可以运行的 ionic 任务。使用类似 npm run clean 就可以运行任务,不需要其他依赖。

清单 1. Npm 配置提供 task runner 功能

{
  //package.json
  "name": "iamsaying",
  "version": "0.0.1",
  "author": "Ionic Framework",
  "homepage": "http://ionicframework.com/",
  "private": true,  
 "scripts": {// 可运行的任务
  "clean": "ionic-app-scripts clean",
  "build": "ionic-app-scripts build",
  "lint": "ionic-app-scripts lint",
  "ionic:build": "ionic-app-scripts build",
  "ionic:serve": "ionic-app-scripts serve"
  }
  //更多
  }

这就有一个问题了,为什么有 npm task runner,还要使用三方的 gulp 来完成此项功能呢?因为 npm task runner 太简单了,从字面上看,只是一条 shell 命令。但是 gulp 能做什么呢?如清单 2 是一段用 gulp 向 index.html 中注入相应的 bower_components 的任务。可以看出,gulp 任务复杂,需要写代码。

清单 2. Gulp 配置注入 index.html 相关的 js 文件

//gulpfile.babel.js
  gulp.task('bower', function () {
  return gulp.src(paths.views.main)
  .pipe(wiredep({
  directory: yeoman.app + '/bower_components'
  }))
  .pipe(gulp.dest(yeoman.app));
  });

Webpack 代替了 grunt/gulp。为什么这么说?因为,Webpack 通过插件提供的能力,可以完成打包、扰码、开发、调试及 css 处理等任务。这块和 grunt/gulp 的功能重复了。事实上,也可以使用 gulp 来运行 Webpack,但是这种设计冗余了,gulp 的存在完全没有必要。

此外,Webpack 还有一项重要的功能,它改变了代码之间依赖的表示方法。上面的 gulp task 中 wiredep 用来在 index.html 中注入项目中所有的 bower 依赖,如清单 3。可以看出,通过浏览器的支持,js 之间可以相互引用,相互依赖。

清单 3. Wiredep 注入引用的 js 文件

<!-- build:js(.) scripts/vendor.js -->
  <!-- bower:js -->
  <script  src="bower_components/jquery/dist/jquery.js"></script>
  <script
  src="bower_components/jquery-ui/jquery-ui.js"></script>
  <script src="bower_components/angular/angular.js"></script>
  <script  src="bower_components/bootstrap/dist/js/bootstrap.js"></script>
  <!-- endbower -->
  <!-- endbuild -->
  <!-- build:js(app) scripts/scripts.js -->
  <!-- 3rd party packages should lay before scripts in projects-->
  <script src="build-scripts/app.js"></script>
  <script src="build-scripts/controllers/main.js"></script>
  <script
  src="build-scripts/controllers/task/management.js"></script>
  <script
  src="build-scripts/controllers/label/management.js"></script>
  <script
  src="build-scripts/controllers/system/management.js"></script>
  <!-- endbuild -->

Webpack 是怎么做的呢?如清单 4,这个代码是放在控制器中,显示的是声明依赖,这里使用了 ES6 的语法 import。相比较 wiredep 中的放在全局、使用相互引用的方式,Webpack 引用更加清晰,按需所取。这样一来,bower 管理器也没有必要存在了,因为 bower 作为服务于浏览器的包管理器,使用方式类似于 wiredep 这种互相引用方式,但是这种互相引用的方式在 Webpack 的声明依赖的模式中,并不适用。

清单 4. Angular2 中的 JS 相互引用

import { AboutPage } from '../pages/about/about';
  import { ContactPage } from '../pages/contact/contact';
  import { HomePage } from '../pages/home/home';
  import { TabsPage } from '../pages/tabs/tabs';

所以,最后架构变成了什么样子? 从 npm 管理后端、控制程序依赖、bower 管理前端 JS 依赖的架构演化成 npm 来管理所有依赖、Webpack 完成打包、测试功能的架构。如图 1。

图 1. 从 Angular1 到 Angular2 的技术演进

利用Angular2 + Ionic3开发IOS应用实例教程

ES6 成为规范

js 框架的发展可谓是百花齐放,但是有一项技术在业界普遍达成共识,那就是 ES6。作为新一代的 js 语法规范,不但在浏览器端得到了广泛实现,而且应用于 Node 引擎端。

ES 对 JS 语言进行了扩充,使之更像是一门规范的面向对象语言。而 TS(typescript)在此基础之上,增加了类型定义及其检查的功能。例如清单 5 的 ionic 初始化程序段,用到了 Platform, StatusBar 的自定义数据类型。

清单 5. Typescript 使用强类型声明变量

export class MyApp {
    rootPage:any = TabsPage;
    constructor(platform: Platform, statusBar: StatusBar, splashScreen:
    SplashScreen) {
    platform.ready().then(() => {
    // Okay, so the platform is ready and our plugins are available.
    // Here you can do any higher level native things you might need.
    statusBar.styleDefault();
    splashScreen.hide();
    });
    }
   }

Angular-cli

最后要说一下 Angular-cli 项目,现在各个框架提供者都会在框架之外提供一个 CLI 工具,包括 ember-cli, vue-cli 等等,帮助生成框架的脚手架。

清单 6. 使用 Angular-cli 初始化项目

> npm install -g @angular/cli
   > ng new project
   > cd project
   > ng serve

总结

现在的 Web 开发技术,大多使用了组件化的模块组织结构,采用 npm/Webpack 等工具统一管理模块依赖。

Ionic3 开发

ionic 是移动端混合开发技术的代表技术,基于 Angular。移动混合开发技术,既使用 Web 开发技术,同时可以生成 IOS 和 Android native 的代码。通过 cordova,支持调用移动设备特有的 API,包括照相机,麦克风等等。随着 Angular 升级到 2,ionic 也支持了 Angular2 和 TS 的语法。

Ionic-cli

Ionic 提供的 CLI 工具,类似于 Angular-cli。我们使用它初始化一个项目。如清单 7。

清单 7. 使用 Ionic-cli 初始化项目

> npm install -g ionic cordova
   > ionic start test tabs
   > cd test
   > ionic serve

全局导航方式

这里可以看到运行 ionic start 创建脚手架的时候可以指定一个模板。如清单 7 中的 tabs。这里的模板分为两种,代表了 ionic 默认提供的两种全局导航方式,tabs 和 menu。

tabs 布局提供了 app 下方的导航。如图 2 的 home,about 的几个选项;menu 布局提供了左边的滑动菜单,点击按钮,会出现滑动选项,如图 3。

图 2. 底部的 tabs 布局方式

利用Angular2 + Ionic3开发IOS应用实例教程

图 3. 侧边栏的 menu 布局方式

利用Angular2 + Ionic3开发IOS应用实例教程

这里提供实现 menu 逻辑布局的代码,如清单 8,需要在控制器中注入 MenuController。

清单 8. Menu 布局的控制器逻辑样例

import { Component } from '@angular/core';
   import {MenuController, NavController} from 'ionic-angular';
   @Component({
    selector: 'page-home',
    templateUrl: 'home.html'
   })
   export class HomePage {
    constructor(public navCtrl: NavController, menu: MenuController) {
    menu.enable(true);
    }
   }

清单 9. Menu 布局的前端显示样例

<ion-header>
    <ion-navbar>
    <button ion-button menuToggle icon-only>
   <ion-icon name='menu'></ion-icon>
    </button>
    <ion-title>
    Menus
    </ion-title>
    </ion-navbar>
   </ion-header>
   <ion-content padding>
    <button ion-button block menuToggle>Toggle Menu</button>
   </ion-content>
   <ion-menu [content]="content">
    <ion-header>
    <ion-toolbar>
    <ion-title>Menu</ion-title>
    </ion-toolbar>
    </ion-header>
    <ion-content>
    <ion-list>
    <button ion-item (click)="openPage(homePage)">
    Home
    </button>
    <button ion-item (click)="openPage(friendsPage)">
    Friends
    </button>
    <button ion-item (click)="openPage(eventsPage)">
    Events
    </button>
    <button ion-item (click)="closeMenu()">
    Close Menu
    </button>
    </ion-list>
    </ion-content>
   </ion-menu>
   <ion-nav id="nav" #content></ion-nav>

页面布局元素

回到单个的页面布局,ionic 提供 header 和 content 两块。每块都可能包含多个元素,并且支持 grid 布局。Grid 类似于 bootstrap 前端布局的方式,它会把页面分为 12 格,可以使用 col-x 标明一个元素在页面中占格的区域。这里给出一个 List 元素在 grid 布局下的应用代码。如清单 10,采用了两个 col-6 把页面分为两列,它生成的样式如图 4。

清单 10. List 元素在 grid 布局下的样例代码

<ion-header>
    <ion-navbar>
    <ion-title>
    About
    </ion-title>
    </ion-navbar>
   </ion-header>
   <ion-content padding>
    <ion-grid>
    <ion-row>
    <ion-col col-6>
   <ion-list>
    <ion-list-header>
    Section I
    </ion-list-header>
    <ion-item>Terminator I</ion-item>
    <ion-item>Blade Runner</ion-item>
    <ion-item>
    <button ion-button color="danger" outline>Choose</button>
    </ion-item>
    </ion-list>
    </ion-col>
    <ion-col col-6>
    <ion-list>
    <ion-list-header>
    Section II
    </ion-list-header>
    <ion-item>Terminator II</ion-item>
    <ion-item>Blade Runner</ion-item>
    <ion-item>
    <button ion-button color="secondary"
    outline>Choose</button>
    </ion-item>
    </ion-list>
    </ion-col>
    </ion-row>
    </ion-grid>
   </ion-content>

图 4. 使用 grid 分割页面布局

利用Angular2 + Ionic3开发IOS应用实例教程

在一个 grid 控制的区域中,可以使用嵌套页面的方式布局元素,例如图 4 中的 list 元素。从大体上,这里的页面布局元素分为两大类。

  • 列式元素,包括 List/Card 等
  • 多页面元素,占据整个页,通过点击实现页面跳转和返回,包括 Modal/Segment/Slide 等

其他元素

当然,还有一些页面必须元素,例如按钮、输入框等用于页面交互的元素;另外,也有提示框,脚标等等提示元素。这块和 Web 开发很相似。

总结

相比于 Web 开发,ionic 同样使用了 grid 的 12 列布局模式。在整体的风格方面,受限于移动端的显示大小,提供的页面分割元素相对简单。在页面交互中,ionic 提供 List,Card,Segment 等页面控制风格,我们可以根据需求选择。

真机测试

最后一段,我们来说一下真机测试。运行添加 IOS 平台命令来初始化 IOS 工作区。完成后,会在项目的 platforms 文件夹下有 ios 目录,这里有生成供 Xcode 调用的代码。如清单 11。

清单 11. Ionic 初始化 ios 和 android 平台

> ionic cordova platform add ios
   > ionic cordova platform add android

使用 xcode 打开 plaforms/ios/test.xcworkspace 工作区。在设备里面,可以选择模拟器例如 iphone6,iphone7,也可以选择连接到 Mac 的真机。由于 IOS 开发是要收费的,所以我们需要配置一个临时测试环境。

  • 打开 Xcode->Preferences->Accounts->Manage Certificates,新增一个 IOS Development 的证书。
  • 修改 Resources 目录下的.plist 文件的 Bundle identifier,给自己的项目填写一个开发组。
  • 最后,在手机上打开通用->设备管理,选择信任开发的 IOS 程序。

如图 5,结果在真机上显示。最后,祝大家早日学会用 ionic3/Angular2 开发出自己的移动端程序。

图 5. 真机测试

利用Angular2 + Ionic3开发IOS应用实例教程

参考资源

参考 Ionic 官方网站 ,了解更多 Ionic UI 组件

查看 Webpack 迁移的研究 ,了解 Webpack 的具体配置方式

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
关于document.cookie的使用javascript
Apr 11 Javascript
基于js与flash实现的网站flv视频播放插件代码
Oct 14 Javascript
JavaScript中实现依赖注入的思路分享
Jan 15 Javascript
jQuery搜索框效果实现代码(百度关键词联想)
Feb 25 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
Sep 01 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
May 17 Javascript
使用cropper.js裁剪头像的实例代码
Sep 29 Javascript
js实现简单数字变动效果
Nov 06 Javascript
ES6学习笔记之map、set与数组、对象的对比
Mar 01 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
Aug 19 Javascript
vue实现鼠标移入移出事件代码实例
Mar 27 Javascript
JS中比Switch...Case更优雅的多条件判断写法
Sep 05 Javascript
js实现一个简单的MVVM框架示例
Jan 15 #Javascript
详解angularjs 学习之 scope作用域
Jan 15 #Javascript
高性能的javascript之加载顺序与执行原理篇
Jan 14 #Javascript
关于axios如何全局注册浅析
Jan 14 #Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
Jan 13 #Javascript
react-redux中connect的装饰器用法@connect详解
Jan 13 #Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
Jan 13 #Javascript
You might like
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
jquery 多级下拉菜单核心代码
2010/05/21 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
javascript性能优化之事件委托实例详解
2015/12/12 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
BootStrap导航栏问题记录
2017/07/31 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
谈谈JavaScript令人迷惑的==与+
2020/08/31 Javascript
[42:52]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
2018/08/30 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
Python面向对象之继承原理与用法案例分析
2019/12/31 Python
Python headers请求头如何实现快速添加
2020/11/03 Python
进修护士自我鉴定
2013/10/14 职场文书
应届生英语教师求职信
2013/11/05 职场文书
学校十一活动方案
2014/02/01 职场文书
保密工作实施方案
2014/02/24 职场文书
工程质量承诺书
2014/03/27 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
大一学生个人总结
2015/02/15 职场文书
医生个人年度总结
2015/02/28 职场文书
实习护士自荐信
2015/03/25 职场文书
干部外出学习心得体会
2016/01/18 职场文书
python如何进行基准测试
2021/04/26 Python
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技
天谕手游15杯全调酒配方和调酒券的获得方式
2022/04/06 其他游戏