看书和视频结合是学习的最高效方式,看了这本书之后对angularjs才算是有一定的理解了。这本书以搭建一个博客为线索讲解了angularjs的知识点和实际项目开发流程。非常适合初学者!下面是我的读书笔记。

一、传统与AngularJS开发模式对比

传统的web框架如Apache  Struts、SpringMVC等mvc框架是主流。web mvc框架完全在服务器运行,所有功能,比如说访问数据库、业务逻辑、显示逻辑和UI活动都在服务器中完成,因此要消耗服务器的内存和资源。

传统web框架通常会是在服务器端使用PHP、ASP、JSP等脚本渲染页面,但是这样会带来很多维护方面的问题。不过这不是传统方式最严重的问题,最严重的问题是传统web框架在移动设备中大都运行缓慢,而与桌面用户相比,移动设备的用户更加不能忍受系统延迟和加载缓慢。因为所有的视图、模型、控制数据库都在后端,而用户的硬件只起到了展示网页的功能。

AngularJS是在移动设备高速普及的情况下,顺应未来趋势而生的客户端js框架,它比起传统的方式,整个Angularjs都运行在用户的硬件中,而后端使用REST web服务处理业务逻辑,REST可以运行在任何地方,也可以使用任何编程语言编写,流行使用JAVA的spring框架或者node.js平台下的Expressjs开发。Angular充分利用了用户的硬件,完全解放了服务器,或者只让服务器处理业务逻辑和数据存储。能够让应用在任何设备下都能良好运行。

二、Angularjs的控制器

1、创建控制器

下面我创建了一个名为myApp的模块,并且为这个模块加上一个名为myAppctrl的控制器

var myApp = angular.module('myApp',[]);
//在angular对象上调用module方法创建了一个名为myApp的模块。
myApp.controller('myAppctrl', ['$scope','$checkCreds','$location','$http',
//在刚刚创建的myApp的模块上又调用了controller方法,定义此控制器的名字为
//myAppctrl。并且[]为这个控制器的依赖,在angular中这称为依赖注入
function (){
//回调函数
}]);

2、控制器的作用

控制器有两个职责,第一个是初始化作用域中的模型属性。创建控制器并将其附加到DOM中之后,会创建一个子作用域,子作用域中保存着一个所属控制器专用的模型。子作用域可以通过$scope对象获取。

我在控制器myAppctrl上添加了两个属性到作用域中name和number

var myApp = angular.module('myApp',[]);
//在angular对象上调用module方法创建了一个名为myApp的模块。
myApp.controller('myAppctrl', ['$scope','$checkCreds','$location','$http',
//在刚刚创建的myApp的模块上又调用了controller方法,定义此控制器的名字为
//myAppctrl。并且[]为这个控制器的依赖,在angular中这称为依赖注入
function myAppctrl($scope){
//回调函数
$scope.name = "lq";
$scope.number = "123";
}]);

接下来就可以在视图模板中访问刚刚添加的两个模型属性,访问方法为双花括号

<div><b>name:</b>{{name}}</div>
<div><b>name:</b>{{number}}</div>

控制器的第二个作用是把行为附加到$scope对象上。附加行为的方式是,在$scope对象上添加方法,在$scope对象上添加了一个changeName的方法

$scope.changeName = function(){
$scope.name = $scope.cName;
$scope.number = $scope.cNumber;
}

那我们在视图模板中怎么使用这个方法呢?

我们使用ng-model="cName",ng-model="cNumber"向模型中添加两个新属性,然后使用ng-click="changeName();"调用刚刚添加到changeName方法。

<form>
<div>
<input type="text" ng-model="cName" required/>
</div>
<div>
<input type="number" ng-model="cNumber" required/>
</div> <div><button ng-click="changeName();">change Name</button></div>
</form>

三、Angular视图

视图由html代码构成,外加一些指令。它是在运行时动态构建视图,合并多个模板,渲染通过$scope对象传入模板的属性。渲染视图的结果是纯样的html绑定在ng-view指令上。ng-repeat是十分常用的表现方式,它相当于是一个for循环,比如说你在控制器中的$scope对象上添加了一个存储数据的json对象list,就可以采用ng-repeat指令来循环这个json对象并把它展现出来。

四、Angular模型

Angular模型保存在$scope对象中,$scope用于访问某个控制器对应的模型。$rootScope是父级作用域,用于保存和访问在多个控制器中使用的模型属性。不过不建议使用$rootScope对象,一个应用中只有一个$rootScope对象,$scope对象是$rootScope对象的子作用域。在开发中我们只要在作用域定义好模型属性,这些属性就可以在视图中访问了,而不需修改视图。

五、Angular的REST服务

rest服务(REpresentational state transfer)表现层状态转化服务的目的是“分离关注点”它是无状态的。REST不能在会话中保存数据。REST服务所需的任何信息都应该放在客户端传给服务的请求和首部中。任何状态都应该保存在客户端,而不能保存在服务器,在Angular中保存状态的方式很多,例如本地存储、cookie或缓存。只有满足以下条件的web服务才称得是REST式服务:

  1、能通过URL访问

  2、使用某种互联网媒介类型如json交换数据

  3、使用标准的HTTP请求方法get post put delete

angularjs通过ajax请求异步调用rest服务,这种ajax请求基于$q服务的Promise对象和deferred对象实现。在angular中创建并注册服务有三种方式

  1、使用service函数。  2、使用provider函数      3、使用factory函数(最常用)

angularjs与rest服务通信的方式:

  1、$http服务,这个服务通过浏览器的XMLHttpRequest对象实现与rest服务的低层交互  2、$resource对象 这个对象提供与rest服务交互的高层方式,极大简化了通信过程。

下面我定义了一个与rest服务交互的angularjs服务

var blogServices=angular.module('services',['ngResource']);
blogServices.factory('BlogPost', ['$resource', function($resource){
return
$resource(url, paramDefaults, actions)
}])

六、服务和业务逻辑

不是所有业务逻辑都在rest服务中,这些业务逻辑通常要在多个控制器中使用,这个时候非rest服务就有用了。比如:

1、认证用户,由于rest服务不能保存状态,而且在服务器的会话中保存用户的认证凭证有安全隐患,所以这时使用angularjs服务最好。

七、Angularjs指令

从用户的角度,指令directive就是在应用的模板中使用的自定义html标签。angularjs的html编译器会解析指令,增强模板的功能。而这个编译器不是正在意义的编译而是搜索DOM树,找出与指令关联的html元素,找到所关联的元素后,编译器会构建模板,把事件附加到模板中的这些元素上。当然我们也可以自定义指令。

AngularJS学习手册的更多相关文章

  1. angularJS学习手册(1)

    欢迎来到augularJS的学习 一.什么是angularJS? angular的英文意思是角,为什么要叫angular我也不知道. AngularJS是一个MV*(Model-View-Whatev ...

  2. Redis学习手册(目录)

    为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...

  3. Angularjs学习---官方phonecat实例学习angularjs step0 step1

    接下来一系列的文章都是学习https://docs.angularjs.org/tutorial的笔记,主要学习的angular-phonecat项目的实现,来介绍angularjs的使用. 1.下载 ...

  4. AngularJS 参考手册

    AngularJS 参考手册 AngularJS 指令 本教程用到的 AngularJS 指令 : 指令 描述 ng-app 定义应用程序的根元素. ng-bind 绑定 HTML 元素到应用程序数据 ...

  5. angularJS学习资源最全汇总

    基础 官方: http://docs.angularjs.org angularjs官方网站已被墙,可看 http://www.ngnice.com/: 官方zip下载包 https://github ...

  6. git学习手册

    #git学习手册 git: Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.[2] Git 是 Linus Torvalds 为了帮助管理 Linux内核开发而 ...

  7. 我的AngularJS 学习之旅

    我的AngularJS 学习之旅 基础篇 1.Angular的 起源 2.比较Web 页面实现的几种方式 3.一些基本术语 4.Angular与其他框架的兼容性 5.总结 6.综合实例   很早之前就 ...

  8. C#学习手册

    考研学子为何放弃考研?C++开发ArcGis为何无疾而终?C#为何又成为新宠?这一切得一切是人性的扭曲还是道德的败坏,敬请收看接下来的C#学习手册.ps:一天一更.拖更打死.

  9. SQL语句学习手册实例版

    SQL语句学习手册实例版 表操作 例1  对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE  TABLE  STUDENTS (SNO      NUMERIC (6, ...

随机推荐

  1. [iOS微博项目 - 1.0] - 搭建基本框架

    A.搭建基本环境   github: https://github.com/hellovoidworld/HVWWeibo   项目结构:   1.使用代码构建UI,不使用storyboard     ...

  2. OAuth 2.0介绍学习

    OAuth2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0. OAuth 2.0关注客户端开发者的简易性.要么通过组织在资源拥有者和HTTP服务商之间的被批 ...

  3. web.xml文件中配置ShallowEtagHeaderFilter需注意的问题

    问题现象及解决方法 今天在Spring MVC应用中加入ShallowEtagHeaderFilter时,发现返回的响应中没有etag头,上网查了很多相关资料,也试了很多方法依然不起作用.在查看web ...

  4. hadoop2.1.0和hadoop2.2.0编译安装教程

    由于现在hadoop2.0还处于beta版本,在apache官方网站上发布的beta版本中只有编译好的32bit可用,如果你直接下载安装在64bit的linux系统的机器上,运行会报一个INFO ut ...

  5. 访问修饰符与可选修饰符static的使用

    在Java中修饰符较多,在这里简单说一说几个访问修饰符的选择使用,和可选修饰符static的使用. 一.访问修饰符:这是Java里用来控制访问类及类的方法.变量的访问权限,从而达到只暴露接口,来隐藏内 ...

  6. mockjs学习总结(方便前端模拟数据,加快开发效率)

      基本介绍: 在我们前端开发中经常遇到这样的事情,接口没有写好,只能写静态页面,如何才能用很简单的方法模拟后端数据呢?mockjs就干了这件事,而且干的还挺好. 下面是我作为初学者的一些总结经验,期 ...

  7. Eclipse10大快捷键组合

    一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升. Ctrl+Shift+C 快速单行注释 也适用于 ...

  8. 第十七章,txt文件的写入和读取数据结合练习(C++)

    #include <iostream> #include <fstream> int main(int argc, char** argv) { std::string str ...

  9. Java 装饰模式 (Decorator)

    装饰模式 动态的将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的取代方案 代码 package gx.component; /** * 组件:装饰类和被装饰类 都要继承:为了类型保持一致 ...

  10. gcc中不同namespace中同名class冲突时

    正常情况下,编译器都会报错,提示你有两个候选类,让你明确的选择一个. 比如我的情况,我自己设计了一个类Message, 然后在某个文件里面引用了它.但是我的文件中又引入了mongodb的头文件,非常不 ...