芯果科技蔡彦 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 目录中调用。