ionic简介+安装+创建App

ionic 教程


<small>ionic 是一个强大的 HTML5 应用程序开发框架(HTML5 Hybrid Mobile App Framework )。 可以帮助您使用 Web 技术,比如 HTML、CSS 和 Javascript 构建接近原生体验的移动应用程序。

ionic 主要关注外观和体验,以及和你的应用程序的 UI 交互,特别适合用于基于 Hybird 模式的 HTML5 移动应用程序开发。

ionic是一个轻量的手机UI库,具有速度快,界面现代化、美观等特点。为了解决其他一些UI库在手机上运行缓慢的问题,它直接放弃了IOS6和Android4.1以下的版本支持,来获取更好的使用体验。


ionic 特点

  • 1.ionic 基于Angular语法,简单易学。
  • 2.ionic 是一个轻量级框架。
  • 3.ionic 完美的融合下一代移动框架,支持 Angularjs 的特性, MVC ,代码易维护。
  • 4.ionic 提供了漂亮的设计,通过 SASS 构建应用程序,它提供了很多 UI 组件来帮助开发者开发强大的应用。
  • 5.ionic 专注原生,让你看不出混合应用和原生的区别
  • 6.ionic 提供了强大的命令行工具。
  • 7.ionic 性能优越,运行速度快。
学习本教程前你需要了解?

学习本教程前你需要了解以下基础知识:


ionic 相关内容
ionic 官方网站:http://ionicframework.com/
ionic 官方文档:http://ionicframework.com/docs/
Github 地址:https://github.com/driftyco/ionic</small>



ionic 安装

<small>本站实例采用了ionic v1.0.1 版本,下载地址为:ionic-v1.0.1.zip
ionic 最新版本下载地址: http://ionicframework.com/docs/overview/#download
下载后解压压缩包,包含以下目录:

css/             => 样式文件
fonts/           => 字体文件
js/              => Javascript文件
version.json     => 版本更新说明

你也可以在 Github 上下载以下资源文件:https://github.com/driftyco/ionic(在release 目录中)。
接下来,我们只需要在项目中引入以上目录中的 css/ionic.min.css 和 js/ionic.bundle.min.js 文件即可创建 ionic 应用。

<big>实例

<ion-header-bar class="bar-positive"> 
    <h1 class="title">Hello World!</h1>
</ion-header-bar> 

<ion-content> 
    <p>我的第一个 ionic 应用。</p>
</ion-content>

尝试一下 »
<small>点击 "尝试一下" 按钮查看在线实例。

本教程着重讲解 ionic 框架的应用,大部分实例在浏览器中运行 ,移动设备上运行可以在接下来的命令行安装教程中详细了解。
注意:在移动应用如 phonegap 中我们只需将对应的 js 和 css 文件加入到资源库中即可。


命令行安装

首先您需要安装 Node.js,我们在接下来的安装中需要使用到其 NPM 工具,更多 NPM 介绍可以查看我们的NPM 使用介绍
然后通过命令行工具安装最新版本的 cordova 和 ionic 。通过参考AndroidiOS 官方文档来安装。
Window 和 Linux 上打开命令行工具执行以下命令:

$ npm install -g cordova ionic

Mac 系统上使用以下命令:

sudo npm install -g cordova ionic

提示: IOS需要在Mac Os X. 和Xcode环境下面安装使用。
如果你已经安装了以上环境,可以执行以下命令来更新版本:

npm update -g cordova ionic

sudo npm update -g cordova ionic
创建应用

使用ionic官方提供的现成的应用程序模板,或一个空白的项目创建一个ionic应用:

$ ionic start myApp tabs
运行我们刚才创建的ionic项目

使用 ionic tool 创建,测试,运行你的apps(或者通过Cordova直接创建)。

创建Android应用
$ cd myApp
$ ionic platform add android
$ ionic build android
$ ionic emulate android

如果一切正常会弹出模拟器,界面如下所示:


创建iOS应用
$ cd myApp
$ ionic platform add ios
$ ionic build ios
$ ionic emulate ios

(额外补充空格代码     以下分别是效果展示)
如果出现 "ios-sim was not found." 错误,可以执行以下命令:
如果出现 "ios-sim was not found." 错误,可以执行以下命令:
如果出现 "ios-sim was not found." 错误,可以执行以下命令:

npm install -g ios-sim

如果一切正常会弹出模拟器,界面如下所示:


Ionic Lab

Ionic Lab 是桌面版的开发环境,如果你不喜欢使用命令行操作,Ionic Lab 将会满足你的需求。
Ionic Lab 为开发者提供了一个更简单的方法来开始,编译,运行,和模拟运行Ionic的应用程序。
Ionic Lab 支持的平台有:Window、Mac OS X、Linux,下载地址为:http://lab.ionic.io/,下载后直接安装即可。整个操作界面如下所示:


通过以上界面你可以完成以下操作:

  • 创建应用
  • 预览应用
  • 编译应用
  • 运行应用
  • 上传应用
  • 运行日志查看
    ……
    推荐使用Sublime Text作为 Ionic 项目的编辑器,我们可以通过 Ionic Lab 直接在Sublime Text 上打开项目,如下图:

    Gif 操作演示


ionic 创建 APP

前面的章节中我们已经学会了 ionic 框架如何导入到项目中。
接下来我们将为大家介绍如何创建一个 ionic APP 应用。
ionic 创建 APP 使用 HTML、CSS 和 Javascript 来构建,所以我们可以创建一个 www 目录,并在目录下创建 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 是正常的。


创建 APP

接下来我们来实现一个包含标题、侧边栏、列表等的应用,设计图如下:


创建侧边栏

侧边栏创建使用 ion-side-menus 控制器。
编辑我们先前创建的 index.html 文件,修改 <body> 内的内容,如下所示:

<body> 
  <ion-side-menus> 
    <ion-side-menu-content> 
    </ion-side-menu-content> 
    <ion-side-menu side="left"> 
    </ion-side-menu> 
  </ion-side-menus>
</body>

控制器解析:

  • ion-side-menus: 是一个带有边栏菜单的容器,可以通过点击按钮或者滑动屏幕来展开菜单。
  • ion-side-menu-content:展示主要内容的容器,可以通过滑动屏幕来展开menu。
  • ion-side-menu:存放侧边栏的容器。
初始化 APP

接下来我们创建一个新的 AngularJS 模块,并初始化,代码位于 www/js/app.js 中:

angular.module('todo', ['ionic'])

之后在我们的 body 标签中添加 ng-app 属性:

<body ng-app="todo">

在 index.html 文件的 <script src="cordova.js"></script> 上面引入 app.js 文件:

<script src="js/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-menu side="left"> 
      <ion-header-bar class="bar-dark"> 
        <h1 class="title">Projects</h1> 
      </ion-header-bar> 
    </ion-side-menu> 

  </ion-side-menus>
</body>

<big>尝试一下 »
<small>以上步骤我们已经完成了 ionic 基本 APP 的应用。


创建列表

首先创建一个控制器 TodoCtrl

<body ng-app="todo" ng-controller="TodoCtrl">

在app.js文件中,使用控制器定义列表数据:

angular.module('todo', ['ionic'])

.controller('TodoCtrl', function($scope) { 
  $scope.tasks = [ 
    { title: '菜鸟教程' },
    { title: 'www.runoob.com' }, 
    { title: '菜鸟教程' }, 
    { title: 'www.runoob.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-menu side="left"> 
    <ion-header-bar class="bar-dark"> 
      <h1 class="title">Projects</h1> 
    </ion-header-bar> 
  </ion-side-menu> 

  </ion-side-menus> 
  <script src="http://www.runoob.com/static/ionic/js/app.js"></script> 
  <script src="cordova.js"></script>
</body>

<big>尝试一下 »


创建添加页面

修改 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>

<small>以上代码中我们通过 <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: '菜鸟教程' }, 
    { title: 'www.runoob.com' }, 
    { title: '菜鸟教程' }, 
    { title: 'www.runoob.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(); 
  };
});

创建侧边栏

通过以上步骤我们已经实现了新增功能,现在我们为 app 添加侧边栏功能。
修改 <ion-side-menu-content> 内的内容,代码如下:

<!-- 中心内容 -->
<ion-side-menu-content> 

  <ion-header-bar class="bar-dark"> 
    <button class="button button-icon" ng-click="toggleProjects()"> 
      <i class="icon ion-navicon"></i> 
    </button> 
    <h1 class="title">{{activeProject.title}}</h1> 
    <!-- 新增按钮 --> 
    <button class="button button-icon" ng-click="newTask()"> 
      <i class="icon ion-compose"></i> 
    </button> 
  </ion-header-bar> 

  <ion-content scroll="false"> 
    <ion-list> 
      <ion-item ng-repeat="task in activeProject.tasks"> 
        {{task.title}} 
      </ion-item> 
    </ion-list> 
  </ion-content>

</ion-side-menu-content>

添加侧边栏:

<!-- 左边栏 -->
<ion-side-menu side="left">

  <ion-header-bar class="bar-dark"> 
    <h1 class="title">Projects</h1> 
    <button class="button button-icon ion-plus" ng-click="newProject()"> 
    </button>
  </ion-header-bar>

  <ion-content scroll="false"> 
    <ion-list> 
      <ion-item ng-repeat="project in projects" ng-click="selectProject(project, $index)" ng-class="{active: activeProject == project}"> 
        {{project.title}} 
      </ion-item> 
    </ion-list>
  </ion-content>

</ion-side-menu>

<ion-item> 中的 ng-class 指令设置菜单激活样式。
这里我们创建一个新的js 文件 app2.js(为了不与前面的混淆),代码如下:

angular.module('todo', ['ionic'])
/** 
 * The Projects factory handles saving and loading projects
 * from local storage, and also lets us save and load the
 * last active project index.
 */
.factory('Projects', function() { 
    return { 
        all: function() { 
            var projectString = window.localStorage['projects']; 
            if(projectString) { 
                return angular.fromJson(projectString); 
            }
            return []; 
        }, 
        save: function(projects) { 
            window.localStorage['projects'] = angular.toJson(projects); 
        }, 
        newProject: function(projectTitle) { 
            // Add a new project 
            return { 
                title: projectTitle, 
                tasks: [] 
            }; 
        }, 
        getLastActiveIndex: function() { 
            return parseInt(window.localStorage['lastActiveProject']) || 0; 
        }, 
        setLastActiveIndex: function(index) { 
            window.localStorage['lastActiveProject'] = index; 
        } 
    }
})

.controller('TodoCtrl', function($scope, $timeout, $ionicModal, Projects, $ionicSideMenuDelegate) { 

    // A utility function for creating a new project 
    // with the given projectTitle 
    var createProject = function(projectTitle) { 
        var newProject = Projects.newProject(projectTitle); 
        $scope.projects.push(newProject); 
        Projects.save($scope.projects); 
        $scope.selectProject(newProject, $scope.projects.length-1); 
    } 

    // Load or initialize projects 
    $scope.projects = Projects.all(); 

    // Grab the last active, or the first project 
    $scope.activeProject = $scope.projects[Projects.getLastActiveIndex()]; 

    // Called to create a new project 
    $scope.newProject = function() { 
        var projectTitle = prompt('Project name'); 
        if(projectTitle) { 
            createProject(projectTitle); 
        } 
    }; 

    // Called to select the given project 
    $scope.selectProject = function(project, index) { 
        $scope.activeProject = project; 
        Projects.setLastActiveIndex(index); 
        $ionicSideMenuDelegate.toggleLeft(false); 
    }; 

    // Create our modal 
    $ionicModal.fromTemplateUrl('new-task.html', function(modal) { 
        $scope.taskModal = modal; 
    }, { 
        scope: $scope 
    }); 

    $scope.createTask = function(task) { 
        if(!$scope.activeProject || !task) { 
            return; 
        } 
        $scope.activeProject.tasks.push({ 
            title: task.title 
        }); 
        $scope.taskModal.hide(); 

        // Inefficient, but save all the projects 
        Projects.save($scope.projects); 

        task.title = ""; 
    }; 

    $scope.newTask = function() { 
        $scope.taskModal.show(); 
    }; 

    $scope.closeNewTask = function() { 
        $scope.taskModal.hide(); 
    } 

    $scope.toggleProjects = function() { 
        $ionicSideMenuDelegate.toggleLeft(); 
    }; 

    // Try to create the first project, make sure to defer 
    // this by using $timeout so everything is initialized 
    // properly 
    $timeout(function() { 
        if($scope.projects.length == 0) { 
            while(true) { 
                var projectTitle = prompt('Your first project title:'); 
                if(projectTitle) { 
                    createProject(projectTitle); 
                    break; 
                } 
            } 
        } 
    });

});

body 中 ion-side-menus 代码如下:

<ion-side-menus>

<!-- 中心内容 -->
<ion-side-menu-content> 
    <ion-header-bar class="bar-dark"> 
        <button class="button button-icon" ng-click="toggleProjects()"> 
            <i class="icon ion-navicon"></i> 
        </button> 
        <h1 class="title">{{activeProject.title}}</h1> 
        <!-- 新增按钮 --> 
        <button class="button button-icon" ng-click="newTask()"> 
            <i class="icon ion-compose"></i> 
        </button> 
    </ion-header-bar> 

    <ion-content scroll="false"> 
        <ion-list> 
            <ion-item ng-repeat="task in activeProject.tasks"> 
                {{task.title}} 
            </ion-item> 
        </ion-list> 
    </ion-content>
</ion-side-menu-content>

<!-- 左边栏 -->
<ion-side-menu side="left">
    <ion-header-bar class="bar-dark"> 
        <h1 class="title">Projects</h1> 
        <button class="button button-icon ion-plus" ng-click="newProject()"> 
        </button>
    </ion-header-bar>
    <ion-content scroll="false"> 
        <ion-list> 
            <ion-item ng-repeat="project in projects" ng-click="selectProject(project, $index)" ng-class="{active: activeProject == project}"> 
                {{project.title}} 
            </ion-item> 
        </ion-list>
    </ion-content>
</ion-side-menu>

</ion-side-menus>

尝试一下 »

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容