文章来源:http://blog.jobbole.com/76265/

AngualrJS是一个很贴心的web应用框架。它有很不错的官方文档和示例;经过在现实环境中的测试著名的TodoMVC project,它在海量的框架中脱颖而出;而且网上到处都是很不错演示或者展示。但是对于一个没有接触过和AngularJS相似的框架而且还是几乎都在使用像jQuery这样的JavaScript类库的开发者来讲,要从jQuery的思想转变成AngularJS的思想是有点困难的。至少对于我来说是这样的,所以我想要分享一些学习笔记希望帮到一些开发者。

Ng不是一个库(library)

要理解AngularJS,第一件要做得事情就是要明白这是一个根本上就和jQuery不一样的工具。jQuery是一个库而AngularJS是一个框架。使用库是指,你的代码决定什么时候从库中调用一个特定的方法;使用框架则是,你实现了一些回调方法,到了特定的时候框架会去调用这些方法。

当你思考下在runtime的时候会发生什么以后你就可以理解这个不同点了。jQuery在与runtime的时候会发生什么?大部分情况下,什么时候都不会发生。jQuery代码的执行是作为触发了DOM事件上绑定的jQuery方法的响应。

在加载的时候,Angular会将你的DOM树和JavaScript转向一个angular app。包含着Angular指令和过滤器的HTML会被编译成一个视图树,响应的范围和控制器会被附加上这个树上,内部的应用循环确保了视图和模型之间的数据绑定。这是一个真正的MVC例子,视图控制器和模型之间是被彻底分离了。你可以认为主要的事件/渲染/绑定循环是一个例子,它持续在运行,只有在需要的时候才调用你的控制器。

每次模型被更新(可以是通过AJAX请求,也可以是直接操作控制器),Angular会重新运行它的$digest循环,更新数据绑定确保所有东西都是同步的。

是声明,而不是命令

不像有些库或者框架,Angualr从不把HTML或者JS当作一个需要修复的bug(我正看着你呢),而是用一个自然的方式让你都不能相信自己并没有在思考。这一点还是让我用代码告诉你吧。

举个例子,我们想要根据checkbox的状态隐藏/显示某一个元素。用jQuery,我们会这么做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<div>
   <input id="toggleShowHide" type="checkbox"><div id=”specialParagraph”>
   This content will disappear and reappear if you click the checkbox above
</div>
<script>
   $(function() {
        function toggle() {
           var isChecked = $('#toggleShowHide').is(':checked');
           var specialParagraph = $('#specialParagraph');
           if (isChecked) {
               specialParagraph.show();
           } else {
               specialParagraph.hide();
           }
       }
       $('#toggleShowHide').change(function() {
           toggle();
       });
       toggle();
   });
</script>

注意!以上的JS代码是用一种命令的方式操作DOM:拿到某一个节点和某一个属性,查看它的值,然后做这做那。现在来看看Angular是怎么做相同的事情的:

1
2
3
4
<input ng-model="showSpecial" type="checkbox">
<div ng-show=”showSpecial”>
   This content will disappear and reappear if you click the checkbox above
</div>

就是上面那段,根本没有什么代码,只是一个非常清楚的声明绑定和规则的方式。这里有个线上版本,你可以来试试.

DOM的直接操作不仅是不必要的,它在Angular中是不被提倡的。DOM由视图管理,data在scope中,方法在控制器里,任何non-trivial的变换在你重写的过滤器和指令里。这样的分离在一开始看上去是要花大量精力去消化,但是当项目变大的时候,它的回报是很可观的:代码容易维护,容易被放入模块中,方便测试和查错。

依赖注入

原谅我这么说听起来有点固执了,但是Angular拥有全世界最优雅的处理数据依赖的方式。你有一个JSON的数据源被放在$resource在Angular中:

1
DataSource = $resource(url, default_params, method_details)

如果要知道更多细节请看文档。任何需要这个JSON数据的控制器,可以通过将DataSource作为一个控制器参数传入的方式来使用它。这就是你需要做的全部事情。如果你需要在控制器中写一个异步的HTTP请求。将$http作为一个控制器参数。如果你需要在console中打印什么,将$log作为你的控制器方法的参数。

在Angular内部的流程是这样的:Angular分析你的代码,找到这些参数,然后将你的代码中所需要的服务推送给你。

数据获取

当Angular给了你控制模型层的全部自由以后(你可以随意结合普通数据变量,对象,和数组的时候)。它提供了一个便捷的方式与服务器的REST API交互。举个例子,下面这个方式是用来定义和使用一些来检索和保存用户记录的调用的。

1
2
3
4
5
var User = $resource('/user/:userId', {userId:'@id'});
var user = User.get({userId:123}, function() {
   user.abc = true;
   user.$save();
});

Angular给获取,设置,删除和查询数据都预定义了合理的默认值设置,用参数表示的URL让你可以根据需求来制定数据获取的方式。

Angular还有很多值得一提但这篇文章还没有说的东西,比如表单验证,单元测试还有angular-ui库,也许在以后的文章里我会说一说的。

jQuery开发者眼中的AngularJS的更多相关文章

  1. 转载:开发者眼中最好的 22 款 GUI 测试工具

    对于很多同学来说gui程序的测试是一个难点,所以我从网上转载了一篇关于gui测试的一篇文章,里面罗列的很多工具,大家可以尝试一下学习学习. 英文原文:22 best GUI testing tools ...

  2. 媲美jQuery的JS框架——AngularJS(一)

    前言 相信原生JS大家都不陌生,至于为什么说原生,是因为在JS的基础上衍生出了很多的框架.有些框架的使用非常广泛,甚至已经达到了媲美原生的地步.在之前的文章中给大家介绍了jQuery这一介绍框架.今天 ...

  3. 媲美jQuery的JS框架----AngularJS(二)

    前言 对于AngularJS什么,小编在这就不多做介绍了.大家可以看小编的上一篇博客. 言归正传,小编在上一篇博客中介绍了AngularJS中的指令.表达式还有非常实用的三种服务.接下来,带大家看一看 ...

  4. Jquery使用ajax以及angularjs 动态模板加载并进行渲染

    1. 源码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  5. 开发者眼中最好的 22 款 GUI 测试工具

    1.Abbot - Java GUI 测试框架 Abbot是一个基于GUI的简单的Java测试框架,它能够帮助开发者测试Java用户界面. 它提供事件自动生成和验证Java GUI组件,使您能够轻松地 ...

  6. 【转载】开发者眼中的Spring与Java EE

    转载自:http://www.infoq.com/cn/news/2015/07/spring-javaee 在Java社区中,Spring与Java EE之争是个永恒的话题.在这场争论中,来自两个阵 ...

  7. 开发者眼中的Spring与JavaEE

    JavaEE与Spring 在Java社区中,Spring与Java EE之争是个永恒的话题.在这场争论中,来自两个阵营的布道师.架构师 与铁杆粉丝都在不遗余力地捍卫着本方的尊严,并试图说服对方加入到 ...

  8. AngularJS 项目开发实战

    目录 啰嗦一下 你问我答 目录结构 压缩 其他 啰嗦一下 最近在开发一个项目时,调研了一下AngularJS,发现这个框架功能很丰富,而且用起来也很方便,所以深入了解了一下,在此分享一下我的感悟. A ...

  9. jQuery和AngularJS的区别小分析

    最近一直在研究angularjs,最大的感受就是它和之前的jQuery以及基于jQuery的各种库设计理念完全不同,如果不能认识到这点而对于之前做jQuery开发的程序员,去直接学习angularjs ...

随机推荐

  1. bzoj 4816 [Sdoi2017]数字表格——反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4816 \( ans=\prod\limits_{d=1}^{n}f[d]^{\sum\lim ...

  2. jdk1.8新特性之函数式接口

    函数式接口就是只有一个抽象方法的接口.如果这个接口里没有或者包含了两个以上的抽象方法,对不起,你不叫函数式接口,只能叫你接口.那这个函数式有啥用呢?如果配合Lambda表达式的话,可以大大的简化代码. ...

  3. Oracle修改字段值包含&字符

    昨天在更新一个表的字段时发现pl/sql弹出变量框,它认为我要改的字段值中包含未定义的变量.比如我执行一个脚本: update t_wlf_config set configvalue = 'hell ...

  4. GNU Radio 入门培训

    1. GNU Radio介绍 1.1 什么是GNU Radio GNU Radio是一个完全开源的软件无线电结构平台,它可以用来设计和仿真,也可以用来连接真实的无线电系统.GNU Radio是一个高度 ...

  5. leaflet简单操作demo

    今天大意了解了一下leaflet这个开源的 JavaScript 库,很强大. 结合腾讯地图,做了个简单的demo,作为一个学习的起点吧(各种API结合自身的业务) <!DOCTYPE html ...

  6. MOSS 2013研究系列---隐藏Ribbon

    我们在开发Sharepoint 2013 的时候,常常需要隐藏Ribbon,那个Ribbon是属于Office的特征,但是我们做门户的时候,大家都不希望看见到它,但是我们又离不开它,以管理的身份进行设 ...

  7. 【转】Jmeter测试报表相关参数说明

    Jmeter测试报表相关参数说明 采用Jmeter测试工具对web系统作的负载测试,得出的响应报表,数据比较难懂,现作一具体说明. 以下是在一次具体负载测试中得出的具体数值,测试线程设置情况为:线程数 ...

  8. UI“三重天”之实践Uiautomator1

    说起来Uiautomator也有一年没碰过了.借此来回顾.总结一下. 也是阅读<精通APP自动化测试>一书.实践出真知的一个框架.编写了部分移动端UI自动化脚本.后续再深入学习. 虽然现在 ...

  9. ubuntu 固定静态IP

    http://jingyan.baidu.com/article/e5c39bf5bbe0e739d7603396.html 路由器每重启一次,IP都会改变,那么实验室的路由器一天要断电好几次,那么每 ...

  10. mac 开启 chrome 和 微信开发者工具 跨域

    微信开发者工具:open -n /Applications/wechatwebdevtools.app --args --disable-web-security --user-data-dir=/U ...