利用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 相关文章推荐
js 绑定带参数的事件以及手动触发事件
Apr 27 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
Apr 22 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
Jul 10 Javascript
js、jquery图片动画、动态切换示例代码
Jun 03 Javascript
jquery中ajax使用error调试错误的方法
Feb 08 Javascript
jquery彩色投票进度条简单实例演示
Jul 23 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
Feb 20 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
May 09 Javascript
webpack+vue.js实现组件化详解
Oct 12 Javascript
详解webpack + react + react-router 如何实现懒加载
Nov 20 Javascript
微信小程序实现简单表格
Feb 14 Javascript
浅谈layer弹出层按钮颜色修改方法
Sep 11 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网站提速三大“软”招
2006/10/09 PHP
开源SNS系统-ThinkSNS
2008/05/18 PHP
PHP 读取文件内容代码(txt,js等)
2009/12/06 PHP
php时间戳转换的示例
2014/03/31 PHP
js操作textarea 常用方法总结
2012/12/03 Javascript
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
2013/06/05 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
Javascript技术栈中的四种依赖注入详解
2016/02/23 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
利用node.js实现自动生成前端项目组件的方法详解
2017/07/12 Javascript
vue中实现左右联动的效果
2018/06/22 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
layui 弹出层回调获取弹出层数据的例子
2019/09/02 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
详细讲解用Python发送SMTP邮件的教程
2015/04/29 Python
Python脚本文件打包成可执行文件的方法
2015/06/02 Python
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
django的403/404/500错误自定义页面的配置方式
2020/05/21 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
Pycharm如何自动生成头文件注释
2020/11/14 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
模特大赛策划方案
2014/05/28 职场文书
庆七一活动总结
2014/08/27 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
服务员岗位职责
2015/02/03 职场文书
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫