jQuery开发者眼中的AngularJS
文章来源: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的更多相关文章
- 转载:开发者眼中最好的 22 款 GUI 测试工具
对于很多同学来说gui程序的测试是一个难点,所以我从网上转载了一篇关于gui测试的一篇文章,里面罗列的很多工具,大家可以尝试一下学习学习. 英文原文:22 best GUI testing tools ...
- 媲美jQuery的JS框架——AngularJS(一)
前言 相信原生JS大家都不陌生,至于为什么说原生,是因为在JS的基础上衍生出了很多的框架.有些框架的使用非常广泛,甚至已经达到了媲美原生的地步.在之前的文章中给大家介绍了jQuery这一介绍框架.今天 ...
- 媲美jQuery的JS框架----AngularJS(二)
前言 对于AngularJS什么,小编在这就不多做介绍了.大家可以看小编的上一篇博客. 言归正传,小编在上一篇博客中介绍了AngularJS中的指令.表达式还有非常实用的三种服务.接下来,带大家看一看 ...
- Jquery使用ajax以及angularjs 动态模板加载并进行渲染
1. 源码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...
- 开发者眼中最好的 22 款 GUI 测试工具
1.Abbot - Java GUI 测试框架 Abbot是一个基于GUI的简单的Java测试框架,它能够帮助开发者测试Java用户界面. 它提供事件自动生成和验证Java GUI组件,使您能够轻松地 ...
- 【转载】开发者眼中的Spring与Java EE
转载自:http://www.infoq.com/cn/news/2015/07/spring-javaee 在Java社区中,Spring与Java EE之争是个永恒的话题.在这场争论中,来自两个阵 ...
- 开发者眼中的Spring与JavaEE
JavaEE与Spring 在Java社区中,Spring与Java EE之争是个永恒的话题.在这场争论中,来自两个阵营的布道师.架构师 与铁杆粉丝都在不遗余力地捍卫着本方的尊严,并试图说服对方加入到 ...
- AngularJS 项目开发实战
目录 啰嗦一下 你问我答 目录结构 压缩 其他 啰嗦一下 最近在开发一个项目时,调研了一下AngularJS,发现这个框架功能很丰富,而且用起来也很方便,所以深入了解了一下,在此分享一下我的感悟. A ...
- jQuery和AngularJS的区别小分析
最近一直在研究angularjs,最大的感受就是它和之前的jQuery以及基于jQuery的各种库设计理念完全不同,如果不能认识到这点而对于之前做jQuery开发的程序员,去直接学习angularjs ...
随机推荐
- angular的require模块的使用($requireProvider的作用)
今天我们学习一下angular的另一个几乎被忽略的模块angular-require 先给出链接地址(git:) https://github.com/Treri/angular-requir ...
- pandas之DateFrame 数据过滤+遍历行+读写csv-txt-excel
# XLS转CSV df = pd.read_excel(r'列表.xls') df2 = pd.DataFrame()df2 = df2.append(list(df['列名']), ignore_ ...
- 用活firewalld防火墙之service
原文地址:http://www.excelib.com/article/291/show 前面学生已经给大家介绍了在firewalld中service的概念以及在zone中怎么使用service,但是 ...
- java 重写 与 重载 用法
图例: 重写: 其实就是获取其他类 和自己类相同的方法名 来使用 重载: 其实就是创建多个相同的方法名,里面装载不同的参数 重写例子: Super关键字 重载的例子:
- jmeter 模拟ajax/ https请求 失败的解决方法
1.去掉请求头的Content-Type字段.Host字段 即可
- java代码----数据类型的转换-----int --->String
总结:int ----->String package com.a.b; //测试..char--->int // int--->String public class Yue2 { ...
- GC之八--GC 触发Full GC执行的情况及应对策略
目录: GC之一--GC 的算法分析.垃圾收集器.内存分配策略介绍 GC之二--GC日志分析(jdk1.8)整理中 GC之三--GC 触发Full GC执行的情况及应对策略 gc之四--Minor G ...
- ThinkPHP 目录结构
2.0 ThinkPHP 目录结构 在前面的博客中,通过一个简单的案例向大家演示了在ThinkPHP 框架下开发的大致法程,本篇博客将对ThinkPHP框架目录结构进行详细讲解. 要想在项目中熟练地使 ...
- Windbg查看w3wp进程占用的内存及.NET内存泄露,死锁分析
https://www.cnblogs.com/startpoint/p/4194052.html https://www.cnblogs.com/lyl6796910/p/7613664.html ...
- JoinableQueue
#!/usr/bin/env python # encoding: utf-8 # Date: 2018/6/17import timefrom multiprocessing import Pro ...