本文原创版权归 简书作者 噜啦啦噜啦啦噜啦噜啦噜 所有,转载请联系作者获得授权,并于文章开头标注原创作者及出处,以示尊重!

文/噜啦啦噜啦啦噜啦噜啦噜(简书作者)
原文链接:http://www.jianshu.com/p/ea0dcf1d31c9
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

AngularJS简介:AngularJS 是一个为动态WEB应用设计的结构框架,提供给大家一种新的开发应用方式,这种方式可以让你扩展HTML的语法,以弥补在构建动态WEB应用时静态文本的不足,从而在web应用程序中使用HTML声明动态内容。


AngularJS有五个主要核心特性,如下介绍:

双向数据绑定—— 实现了把model与view完全绑定在一起,model变化,view也变化,反之亦然。

模板—— 在AngularJS中,模板相当于HTML文件被浏览器解析到DOM中,AngularJS遍历这些DOM,也就是说AuguarJS把模板当做DOM来操作,去生成一些指令来完成对view的数据绑定。

MVVM—— 吸收了传统的MVC设计模式针但又并不执行传统意义上的MVC,更接近于MVVM(Moodel-View-ViewModel)。

依赖注入—— AngularJS拥有内建的依赖注入子系统,可以帮助开发人员更容易的开发,理解和测试应用。

指令—— 可以用来创建自定义的标签,也可以用来装饰元素或者操作DOM属性


ionic简介: ionic是一个强大的_混合式/hybrid_HTML5移动开发框架,特点是使用标准的HTML、 CSS和JavaScript,开发跨平台(目前支持:Android、iOS,计划支持:Windows Phone、Firefox OS) 的原生App应用。


ionic简介

ionic主要包括三个部分:

CSS框架- 提供原生_App质感的CSS样式模拟_。ionic这部分的实现使用了ionicons图标样式库。

JavaScript框架- ionic基于AngularJS基础框架开发,遵循AngularJS的框架约束;主要提供了适应移动端UI的 AngularJS的扩展,主要包括指令和服务。此外,ionic使用AngularUI Router来实现前端路由。

命令行/CLI- 命令行工具集用来简化应用的开发、构造和仿真运行。ionic命令行工具使用了 Cordova,依赖于平台SDK(Android & iOS)实现将移动web项目打包成原生app。

由于ionic使用了HTML5和CSS3的一些新规范,所以要求iOS7+/Android4.1+。 在低于这些版本的手机上使用ionic开发的应用,有时会发生莫名其妙的问题。


安装ionic/Install Ionic

首先您需要安装Node.js. 其次, 安装最新版本的cordova 和 ioniccommand-line tools. 通过参考AndroidiOS官方文档来安装.

npm install -g cordova ionic

通过Ionic创建一个项目

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

ionic start myApp blank  创建一个空白的app项目 (下图1)

ionic start myApp tabs 创建一个带有tabs项目(下图2)

ionic start myApp sidemenu 创建一个带有滑动的项目(下图3)

上述图片

我现在创建一个空白的项目 ionic start myApp blank

cmd窗口

然后我们看到有myApp项目生成。如下目录

然后打开index就能运行项目了

然后我们用浏览器打开index就可以看的如下图的东西了。

index.html

接着下一步,我们用编辑器打开index.html。观察里面所引入的文件,我的习惯把跟项目无关的文件删除了。你可以不删除,我也改动了部分文件的位置,之所以叫你观察里面引入的文件,就是怕你删错了,项目启动不了。改动完结构如下:

项目结构

其中配置文件,controller,driectives,filter,services,文件都是我新建的。

下面先从app.js说起

app.js

这个myApp需要在根节点启动。一个项目建议一个这样的模块。

 

上述路由config配置是基于ui-router,因为在index.html已经引入了ionic.bundle.min.js文件,这个文件把angular.js和ui-router及ionic所需的组件都帮我们打包好了,所以引用很方便。
打开这个ionic.bundle.min.js看一下就知道合成了什么东西了,如图:

 

把6个文件包合成一个了,你可以分别百度看看各是什么包,留给你们思考。

$stateProvider.state(name, {
    url: '',
    templateUrl:'', // 这个是模板位置
    controller: '' // 这个是对应模板的controller名称!记住是名称不是位置
});

上述是ui-router的基本用法,详情用法可以去查看官方文档。

app.js配置完,下面就配置controller

刚才我们配置完了app.js,我们要新建一个名字叫homeCtrl的controller。命名我建议XXXCtrl或者XXXController,当然以你们项目为标准。

homeCtrl

采用闭包的模式创建controller,为了保险防止不必要变量污染的错误。其中

angular.module('myApp') 就是载入刚才创建的模块,然后设置一个叫做homeCtrl的controller,

格式一般都是angular.module('myApp').controller(name, [params, function(params) {}])。

创建完成homeCtrl之后呢,在index.html中引用,如下图:

记得在app.js下面引用

好了,我们根据刚才配置的路由创建完了controller,现在就差模板了。

创建home模板

在刚才创建文档template文件夹当中,新建一个home.html。也就是刚才配置app.js中的路由中写的路径和名字,忘记的回头看看app.js是怎样写的。在刚才创建的home.html,写上以上内容

如下图:

home.html

在项目中我们这样写着,凡是带有<ion-xxx></ion-xxx>都是ionic框架自带的。这是一个指令,如果你还不明白指令什么意思,没关系。你就当做一个带有某些功能的自定义标签。
创建home.html模板和homeCtrl.js之后。我们试着启动,在浏览器中打开index.html这个文件,这个文件作为一个项目的入口。ion-view就是这个页面的顶层,所有内容都在这个view中,ion-header就是那个头部,ion-content就是内容。这些都不是必须的,但是我建议这样写,因为ionic有些组件是需要在这些标签里面才能起作用的。然后看到如下图:

index.html

当看到页面和控制台都出现“hello world”文字,证明我们成功了,项目启动成功。

创建app.js和html模板及homeCtrl模板总结

其实我们写项目的思路:举刚才那个例子

1、创建一个app.js,首先能启动项目,然后配置路由。其中路由需要模板controller那么问题来了,接着看2、3、步。

2、然后创建模板,XXX.html模板。

3、最后创建XXXCtrl.js的controller。

编写控制器与模板

下面来点有意思的吧,先来个轮播图。那就用ionic框架自带的吧,具体查文档即可,如下图:

添加如下html

刷新浏览器如下图:

多了banner

好了,这证明我们成功了,可以滑动,可以自带切换。其实还有很多功能,可以查阅文档尝试。一般由于手机网站banner都是从后台读取数据的,那么我们来改写。在controller获取数据,然后赋值给$scope变量,由于页面和对应controller的$scope有关联,所以对应页面上的属性也会变好,是不是还是不太明白,那么来看代码吧。homeCtrl如下:

homeCtrl

home.html

我们把代码改成

1、ng-repeat="item in views.slideData track by $index",意思就是从$scope.views.slideData数组遍历,item是数组里面的某一项,track by $index其实是性能优化,后续会讲,你也可以不写直接ng-repeat="item in views.slideData"

2、之前由<img src="路径"> 这种变成  <img ng-src="{{item}}",其中ng-src是一个angular自带的指令,item是数组遍历出来的路径

从服务器获取数据

啰嗦的话不说了,直接上案例。如图:

获取数据,输出到列表

既然要数据,那么先建一个服务,使用 angular.module 的 factory API创建服务,是最常见也是最灵活的方式。其实还有几种

factory()

service()

constant()

value()

provider()

,具体详情查文档,不过多数项目用这种(factory)创建方法就满足需求了。举个简单例子

factory() 方法是创建和配置服务的最快捷方式。 factory() 函数可以接受两个参数。

name (字符串)

需要注册的服务名。

getFn (函数)

这个函数会在AngularJS创建服务实例时被调用。

angular.module('myApp')

.factory('myService', function() {

return {

'username': 'auser'

};

});

要上我们真实的示例代码了哦,如下图:

这个文件是当初新建的servers。

有同学觉得奇怪了,怎么会是app.factory呢?其实app就是angular.module('myApp',[]),我在app.js文件里面把angular.module('myApp',[])赋值给全局变量app了。见下图:

app.js

我们建好了servers。在index.html里面引入哦:

index.html

好!创建好servers.js,还有在index中引入。那么怎么在controller中调用呢?那我们来看看改写后的controller,如图:

homeCtrl

控制台

我们创建services到调用services里面的ajax请求都成功了,如何在homeCtrl中获取数据呢?

那就先从services改写开始,如下图:

services

homeCtrl怎么获取数据?看下图:

homeCtrl

调用myFactory.getList()方法为什么后面还跟着一个then的。其实我们使用内置的 $http 服务直接同外部进行通信。 $http 服务只是简单的封装了浏览器原生的 XMLHttpRequest 对象。$http 服务是只能接受一个参数的函数,这个参数是一个对象,包含了用来生成HTTP请求的配置内容。这个函数返回一个promise对象, 由于 $http 方法返回一个promise对象,我们可以在响应返回时用 then 方法来处理回调。如果使用 then 方法,会得到一个特殊的参数,它代表了相应对象的成功或失败信息,还可以接受两个可选的函数作为参数。或者可以使用 success 和 error 回调代替,至于promise对象是什么,这里就不一一叙述了,写起来篇幅比较大,还是留给你们查文档吧。

promise.then(function(resp){

// resp是一个响应对象

}, function(resp) {

// 带有错误信息的resp

});

// 或者使用success/error方法

promise.success(function(data, status, headers, config){

// 处理成功的响应

});

// 错误处理

promise.error(function(data, status, headers, config){

// 处理非成功的响应

});

然后看看控制台输出什么,还是看图:

控制台显示调用接口成功

OK!大功告成,我们可以把这些数据绑定在$scope上,然后渲染到页面。还是看图:

homeCtrl

home.html

列表变化

总结:

1、创建services并写好里面的服务,然后在index.html引入services。

2、homeCtrl中注入依赖services里面的factory服务,调用里面的方法。

3、在homeCtrl调用factory服务方法,然后获取数据。再把数据赋值给$scope。所以模板也能获取$scope里面的数据,那么页面数据就更新了。

编写过滤器

上面已经教会大家如何建立一个services服务获取数据,但是有时候我们获取数据回来的数据做进一步修改显示在页面,下面假如我们有一个需求,我想把姓名全部变成大写。

1、首先创建一个filter。

2、在index.html引入filter。(这个不说了,请看上面services怎么引入的)

filter.js

在home.html页面中,姓名这样写。

姓名:{{item.Name | toUpperCaseText}}

变成大写了

那么我现在想把城市变成小写,怎么弄?留给你们一个作业吧。

正如前面所见,创建自定义过滤器非常容易。创建自定义过滤器需要将它放到自己的模块中。过滤器本质上是一个会把我们输入的内容当作参数传入进去的函数。上面只是一个简单的例子,其实就是把数据获取进来,数据进来了,你想怎样处理数据就怎样处理。相当于你小时候,你骗你爸爸妈妈零用钱的时候,钱到你口袋了,至于钱怎么用了,那是你自己的事。当你爸爸妈妈问你拿去干什么的时候,你告诉他了,那就相当于把数据处理完渲染在页面了。过滤器其实内置有很多很好用的,需要的时候时不时的查看文档就行了。用法就是这么简单。

过滤器总结

1、分析需求怎样的数据在页面,查阅内置过滤器是否满足需求。

2、假如需求内置过滤器不能满足,创建filter.js,编写处理数据逻辑。

3、在index.html引入过滤器。在需要用过滤器的加上“|”,例如:{{item.Name | toUpperCaseText}}

页面之间传递数据

当我们写完home.html页面并且完成了homeCtrl,及通过services获取后台服务器的数据,展示到页面,证明我们成功了一个小项目的大部分。你可以想象,一个项目都是获取数据,展示数据(至于怎样展示,点击展示还是默认展示,这是交互性的东西),或者提交数据,提交数据本文并没有说,但是我们已经知道怎样获取了,提交还困难么。都是差不多的原理。自己翻阅文档看看$http的方法就可以解决了。我们下面继续实现一个需求,点击刚才的某一项列表,跳到详情页。

新建一个详情页detail.html,新建一个detailCtrl的控制器,并且配置详情页路由。忘记了的可以看看前面新建home的步骤。(记得在index.html引入detailCtrl哦,否则会报下面的错,看图

当我们跳转detail路由时候,由于没引入对应的detailCtrl,会报错

下面展示路由配置及detail.html页面和detailCtrl.js

路由配置

detailCtrl

detail.html

我们配置完路由和新建detail的页面及controller。我们实现点击列表跳转到detail页面,并带上数据。我再啰嗦一次,本文带有<ion-xxx>都是ionic框架自带的,ion-view就是这个页面的顶层,所有内容都在这个view中,ion-header就是那个头部,ion-content就是内容。这些都不是必须的,但是我建议这样写,因为ionic有些组件是需要在这些标签里面才能起作用的。

那我们点击列表

思路就是ng-click="views.goDetail(item)"; views.goDetail就是跳转到detail页面,跳转路由使用$state.go("XXX");XXX代表路由的名称,item就是你点击某一项的数据,看图:

ng-click,home.html中

homeCtrl

我们点击列表的时候既可以,可以看到console把item的内容打印出来。

console.log(item)

现在需求要实现下面的详情图。

点击详情

如何实现从A页面==》B页面,并且把A页面的数据带到B页面。下面来探讨angular页面之间的传递数据方式。下面讲5种方法,可能有更多,但是我选常用的讲。

1、可以用$rootScope顶级作用域,从A页面赋值给$rootScope的某个属性,然后B页面获取数据赋值到页面。

homeCtrl

detailCtrl

detail.html

结果,如大家所愿详情页能实现刚才的效果了。

2、在A页面用$state.go("xxx", {obj});配置路由参数,然后在B页面用$stateParams对象获取url的参数。

homeCtrl,item是个对象来的,也可以是字符串

 

detailCtrl

 

使用这个方法从home页面传递过来的url

3、在services里面建立一个服务,在A页面把数据传递给这个服务,然后在B页面获取这个服务的值。为什么可以这样做?因为services服务里面的方法是共享的,当项目初始化的时候services已经实例化了一次(服务是一个单例对象,在每个应用中只会被实例化一次(被 $injector 实例化),并且是延迟加载的(需要时才会被创建)),所以不存在跳转页面就数据没了。(这个是最佳实践哦,不过也要看业务场景。这个是我最常用的)。

services.js

homeCtrl设置值

detailCtrl

detail.html

detail.html

页面之间的传递数据,以上是常用的3种。下面介绍没那么常用的:

利用localStorage、sessionStorage、cookie在A页面中存值,然后在B页面中获取值,这3个都是可以存储数据。他们之间的区别你们查文档吧,哈哈哈~~~~ 留给你们思考。

数据绑定

数据绑定,从刚一开始从服务获取数据,然后把数据绑定到$scope上,然后在页面输入{{}}花括号输出,这种就是数据绑定了。那我们来个假设,现在有个输入框,输入框是多少,列表中的那个人的年龄是多少。

由于这个需求,就是双向数据绑定,可以ng-model用绑定一个变量,这个变量赋值给年龄,那么年龄也跟着变了。看下图:

detailCtrl.js

 

detail.html

页面显示

好啦好啦,初始化做完了。下面呢,我们在input输入框值,改变一下input框里面的值,看看有什么变化。

改变了

输入框里面的值改变了,上面的年龄值也改变了。证明$scope.views.age的值改变了,这些就是数据绑定了。

数据绑定总结

当AngularJS认为某个值可能发生变化时,它会运行自己的事件循环来检查这个值是否变“脏”。如果该值从上次事件循环运行之后发生了变化,则该值被认为是“脏”值。这也是Angular可以跟踪和响应应用变化的方式。这个事件循环会调用$digest()循环(这个你们查查文档就能知道了)。这个过程被称作脏检查(dirty checking)。脏检查是检查数据模型变化的有效手段。当有潜在的变化存在时,AngularJS会在事件循环时执行脏检查(查阅文档)来保证数据的一致性。

 

Angularjs和Ionic框架搭建webApp的更多相关文章

  1. Ionic框架搭建简明教程

    1.安装node.js 安装教程:https://www.cnblogs.com/zhouyu2017/p/6485265.html 安装完成后,执行:cnpm install –g cordova ...

  2. 问题解决:使用angularjs、ionic框架如何实现返回上一页并刷新

    普通的js返回并刷新这里就不多说了,百度就有很多方法. 下面说的是使用了angularjs.ionic开发的一个手机app中使用的一个返回上一页并刷新的方法. 场景:回复的页面是单独的,点击保存回复后 ...

  3. angular.js和ionic框架搭建一个webApp

    原文地址:http://www.jianshu.com/p/ea0dcf1d31c9

  4. 基于AngularJS/Ionic框架开发的性能优化

    AngularJS作为强大的前端MVVM框架,虽然已经做了很多的性能优化,但是我们开发过程中的不当使用还是会对性能产生巨大影响. 下面提出几点优化的方法: 1. 使用单次绑定符号{{::value}} ...

  5. Github+yeoman+gulp-angular初始化搭建angularjs前端项目框架

    在上篇文章里面我们说到了Github账号的申请与配置 那么当你有了Github账号并创建了一个自己的Github项目之后,首要的当然是搭建自己的项目框架啦! 本人对自己的定位是web前端狗,常用开发框 ...

  6. Angular企业级开发(5)-项目框架搭建

    1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...

  7. SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...

  8. ssh框架搭建的基本步骤(以及各部分作用)

    ssh框架搭建的基本步骤(以及各部分作用)     一.首先,明确spring,struts,hibernate在环境中各自的作用.   struts: 用来响应用户的action,对应到相应的类进行 ...

  9. Spring MVC + jpa框架搭建,及全面分析

    一,hibernate与jpa的关系 首先明确一点jpa是什么?以前我就搞不清楚jpa和hibernate的关系. 1,JPA(Java Persistence API)是Sun官方提出的Java持久 ...

随机推荐

  1. Item2的使用

    网址:http://wulfric.me/2015/08/iterm2/ 巧用 Command 键 按住⌘键: 可以拖拽选中的字符串: 点击 url:调用默认浏览器访问该网址: 点击文件:调用默认程序 ...

  2. JNDI数据源

    孤傲苍狼 只为成功找方法,不为失败找借口! JNDI学习总结(一)——JNDI数据源的配置 一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下:   ①加载数据库驱动程序(Cla ...

  3. 253. Meeting Rooms II 需要多少间会议室

    [抄题]: Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],.. ...

  4. jquery的get()方法

    通过检索匹配jQuery对象得到对应的DOM元素. .get( [index ] ) index 类型: Integer 从0开始计数,用来确定获取哪个元素. .get() 方法允许我们直接访问jQu ...

  5. tornado异步请求非阻塞-乾颐堂

    前言 也许有同学很迷惑:tornado不是标榜异步非阻塞解决10K问题的嘛?但是我却发现不是torando不好,而是你用错了.比如最近发现一个事情:某网站打开页面很慢,服务器cpu/内存都正常.网络状 ...

  6. Mac Sublime 相关资源

    MAC上安装并破解最新SublimeText3103版本 http://blog.csdn.net/yanzi1225627/article/details/50703942 Mac版的Sublime ...

  7. WindowServer2016无法安装.netframework3.5

    因为安装sql server的原因 需要安装.NET Framework3.5 报错内容如下: 原因分析 找不到安装源文件. 解决办法 可以通过如下 PowerShell 脚本进行安装: 从开始菜单中 ...

  8. Demo—cookie电商购物车

    说明:cookie的操作须有域名,简单点说就是需要用发布的方式去访问,查看cookie信息请用开发者模式进入application栏 1.页面布局(结构)(根目录) 商品列表 <!doctype ...

  9. Discuz核心函数的解析

    dz采用的是多入口的方式,在每个入口函数你能看到引用,启动核心类的语句(其余省略),如下: require './source/class/class_core.php'; C::app()-> ...

  10. C# 生成dll文件 并导入使用

    首先 在unity创建一个脚本 并编写内容,其中需要调用的方法.变量要公有化(也可以直接新建cs文件用编译器打开编译,但要先导入UnityEngine.dll). 然后,复制脚本关闭unity,在外界 ...