芯果科技蔡彦 2016-08-25
1.ionic 基于Angular语法,简单易学。
2.ionic 是一个轻量级框架。
3.ionic 完美的融合下一代移动框架,支持 Angularjs 的特性, MVC ,代码易维护。
4.ionic 提供了漂亮的设计,通过 SASS 构建应用程序,它提供了很多 UI 组件来帮助开发者开发强大的应用。
5.ionic 专注原生,让你看不出混合应用和原生的区别
6.ionic 提供了强大的命令行工具。
7.ionic 性能优越,运行速度快。
ionic 创建 APP 使用 HTML、CSS 和 Javascript 来构建,所以我们可以创建一个 html 目录,并在目录下创建 index.html 文件,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Todo</title>
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<link href="lib/ionic/css/ionic.css" rel="stylesheet">
<script src="lib/ionic/js/ionic.bundle.js"></script>
<!-- 在使用 Cordova/PhoneGap 创建的 APP 中包含的文件,由 Cordova/PhoneGap 提供,(开发过程中显示 404) -->
<script src="cordova.js"></script>
</head>
<body>
</body>
</html> 以上代码中,我们引入了 Ionic CSS 文件、 Ionic JS 文件及 Ionic AngularJS 扩展ionic.bundle.js(ionic.bundle.js)。
ionic.bundle.js 文件已经包含了 Ionic核心JS、AngularJS、Ionic的AngularJS扩展,如果你需要引入其他 Angular 模块,可以从 lib/js/angular 目录中调用。
cordova.js 是在使用 Cordova/PhoneGap 创建应用时生成的,不需要手动引入,你可以在 Cordova/PhoneGap 项目中找到该文件,所以在开发过程中显示 404 是正常的。
接下来我们来实现一个包含标题、列表等的应用,设计图如下:

创建一个新的 AngularJS 模块,并初始化,代码位于 html/app.js 中:
angular.module('todo', ['ionic']) 在 index.html 文件的 <script src="cordova.js"></script> 上面引入 app.js 文件:<script src="app.js"></script>修改 index.html 文件 body 标签的内容,代码如下所示:
<body ng-app="todo">
<ion-side-menus>
<!-- 中心内容 -->
<ion-side-menu-content>
<ion-header-bar class="bar-dark">
<h1 class="title">Todo</h1>
</ion-header-bar>
<ion-content>
</ion-content>
</ion-side-menu-content>
</ion-side-menus>
</body> 以上步骤我们已经完成了 ionic 基本 APP 的应用。首先创建一个控制器 TodoCtrl:
<body ng-app="todo" ng-controller="TodoCtrl">在app.js文件中,使用控制器定义列表数据:
angular.module('todo', ['ionic'])
.controller('TodoCtrl', function($scope) {
$scope.tasks = [
{ title: 'SSLJ测试一' },
{ title: 'www.sslj.com' },
{ title: 'SSLJ测试二' },
{ title: 'www.sslj.com' }
];
}); 在index.html页面中数据列表我们使用 Angular ng-repeat 来迭代数据:<!-- 中心内容 -->
<ion-side-menu-content>
<ion-header-bar class="bar-dark">
<h1 class="title">Todo</h1>
</ion-header-bar>
<ion-content>
<!-- 列表 -->
<ion-list>
<ion-item ng-repeat="task in tasks">
{{task.title}}
</ion-item>
</ion-list>
</ion-content>
</ion-side-menu-content> 修改后 index.html body 标签内代码如下:<body ng-app="todo" ng-controller="TodoCtrl">
<ion-side-menus>
<!-- 中心内容 -->
<ion-side-menu-content>
<ion-header-bar class="bar-dark">
<h1 class="title">Todo</h1>
</ion-header-bar>
<ion-content>
<!-- 列表 -->
<ion-list>
<ion-item ng-repeat="task in tasks">
{{task.title}}
</ion-item>
</ion-list>
</ion-content>
</ion-side-menu-content>
</ion-side-menus>
<script src="http://www.runoob.com/static/ionic/js/app.js"></script>
<script src="cordova.js"></script>
</body> 修改 index.html 在 </ion-side-menus> 后添加如下代码:
<script id="new-task.html" type="text/ng-template">
<div class="modal">
<!-- Modal header bar -->
<ion-header-bar class="bar-secondary">
<h1 class="title">New Task</h1>
<button class="button button-clear button-positive" ng-click="closeNewTask()">Cancel</button>
</ion-header-bar>
<!-- Modal content area -->
<ion-content>
<form ng-submit="createTask(task)">
<div class="list">
<label class="item item-input">
<input type="text" placeholder="What do you need to do?" ng-model="task.title">
</label>
</div>
<div class="padding">
<button type="submit" class="button button-block button-positive">Create Task</button>
</div>
</form>
</ion-content>
</div>
</script>以上代码中我们通过 <script id="new-task.html" type="text/ng-template"> 定义了新的模板页面。
表单提交时触发 createTask(task) 函数。
ng-model="task.title" 会将表单的输入数据赋值给 task 对象的 title 属性。
修改 <ion-side-menu-content> 内的内容,代码如下:
<!-- 中心内容 -->
<ion-side-menu-content>
<ion-header-bar class="bar-dark">
<h1 class="title">Todo</h1>
<!-- 新增按钮-->
<button class="button button-icon" ng-click="newTask()">
<i class="icon ion-compose"></i>
</button>
</ion-header-bar>
<ion-content>
<!-- 列表 -->
<ion-list>
<ion-item ng-repeat="task in tasks">
{{task.title}}
</ion-item>
</ion-list>
</ion-content>
</ion-side-menu-content>app.js 文件中,控制器代码如下:
angular.module('todo', ['ionic'])
.controller('TodoCtrl', function($scope, $ionicModal) {
$scope.tasks = [
{ title: 'SSLJ测试一' },
{ title: 'www.sslj.com' },
{ title: 'SSLJ测试二' },
{ title: 'www.sslj.com' }
];
// 创建并载入模型
$ionicModal.fromTemplateUrl('new-task.html', function(modal) {
$scope.taskModal = modal;
}, {
scope: $scope,
animation: 'slide-in-up'
});
// 表单提交时调用
$scope.createTask = function(task) {
$scope.tasks.push({
title: task.title
});
$scope.taskModal.hide();
task.title = "";
};
// 打开新增的模型
$scope.newTask = function() {
$scope.taskModal.show();
};
// 关闭新增的模型
$scope.closeNewTask = function() {
$scope.taskModal.hide();
};
});至此,一个简单的Hybrid App已经基本完成。
示例目录结构如下,请严格按照目录结构建立相关的可视化文件目录

可以看到,整个项目组织结构分为:框架目录、可视化文件结构目录。每个可视化文件结构目录下应有如下分目录或文件:css文件夹(放置该控制器下所有的css样式)、images文件夹(放置该控制器下所有的图片资源)、js文件夹(包含controller文件夹、service文件夹、module文件等)和template文件夹(放置该控制器下所有模板)。
每个controller.js依赖于对应的service.js,而service.js依赖于module.js,而module.js实在main.js中引用的。在index.html中又引用了main.js文件。这样整个项目就通过这根线串联起来。
核心代码如下:
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1"/>
<meta http-equiv="pragma" content="no-cache"/>
<meta http-equiv="cache-control" content="no-store, must-revalidate"/>
<meta http-equiv="expires" content="0"/>
<meta name="format-detection" content="telephone=no" searchtype="map">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="white">
<title></title>
<link href="../ionic/css/ionic.min.css" rel="stylesheet">
<link href="css/tabs.css" rel="stylesheet">
<!--<link href="school/css/school.css" rel="stylesheet">-->
<!--<link href="mine/css/mine.css" rel="stylesheet">-->
</head>
<body>
<!--
The nav bar that will be updated as we navigate between views.
-->
<ion-nav-bar class="bar-stable">
<ion-nav-back-button>
</ion-nav-back-button>
</ion-nav-bar>
<!--
The views will be rendered in the <ion-nav-view> directive below
Templates are in the /templates folder (but you could also
have templates inline in this html file if you'd like).
-->
<ion-nav-view></ion-nav-view>
</body>
</html>
<script type="text/javascript">var IsDebug = true;</script>//浏览器调试模式,正式发布时请务必注释
<script type="text/javascript" src="../kerkee.js"></script>//跨平台开发框架,解决跨域问题
<script type="text/javascript" src="../core/require.js" data-main="main.js"></script>
//require.js:在里面可实现模块化开发,可加入相关指令。封装相关方法。不建议改动 'use strict';
//requirejs通用模块设置
requirejs.config({
baseUrl: "../../html",
paths: {
core: "core",
api: "core/coreApi",
deviceInfo: "core/coreApi/device/deviceInfo",//调用原生相关功能
ionic: "ionic/js/ionic.bundle.min",
app: "modules/app",
appController: "modules/appController",
appService: "modules/appService",
homeModule: "modules/home/js/homeModule",
md5: "core/coreApi/device/md5", //调用原生相关功能
bootstrap: "modules/bootstrap"
},
shim: {
app: {
exports: "app"
},
util: {
exports: "util"
},
deviceInfo: {
exports: "deviceInfo"
},
ionic: {
exports: "ionic"
},
appController: {
exports: "controllers"
},
appService: {
exports: "services"
},
homeModule: {
exports: "homeModule"
},
md5: {
exports: "md5"
},
bootstrap: {
deps: ["deviceInfo", "ionic"],
exports: "bootstrap"
}
},
deps: [
'bootstrap'
]
});
以上代码中,我们引入了 Ionic CSS 文件、 Ionic JS 文件及 Ionic AngularJS 扩展ionic.bundle.js(ionic.bundle.js)。
ionic.bundle.js 文件已经包含了 Ionic核心JS、AngularJS、Ionic的AngularJS扩展,如果你需要引入其他 Angular 模块,可以从 lib/js/angular 目录中调用。