文章来源: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. C# 6.0 新特性收集

    先来看一段Json.Net的代码 public JObject ToJson() { var result = new JObject(); result["X"] = X; re ...

  2. 【Leetcode 167】Two Sum II - Input array is sorted

    问题描述:给出一个升序排列好的整数数组,找出2个数,它们的和等于目标数.返回这两个数的下标(从1开始),其中第1个下标比第2个下标小. Input: numbers={2, 7, 11, 15}, t ...

  3. MySQL Join算法与调优白皮书(一)

    正文 Inside君发现很少有人能够完成讲明白MySQL的Join类型与算法,网上流传着的要提升Join性能,加大变量join_buffer_size的谬论更是随处可见.当然,也有一些无知的PGer攻 ...

  4. java代码---------再练习ChatAt()的用法

    总结: 没有理解方法的含义.瞎用 package com.mmm; //实现字符串中某个字符出现的次数 public class Mo { public static void main(String ...

  5. eclipse插件-easy explore

    最近找到一个Eclipse的插件,名字是Easy Explore,是Easy Structs 其 中的一个部分.主要的功能就是在Eclipse里面视图的部分如果看到自己的工程,或者Package,包什 ...

  6. 纯css实现点击事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 小程序picker组件当range是objectArray时的使用

  8. ncbi API

    https://www.ncbi.nlm.nih.gov/sviewer/?db=nuccore&query_key=2&term=DYNLL2&page_size=1& ...

  9. 2.docker学习之linux安装

    Docker CE is supported on CentOS 7.3 64-bit. 说明docker只能安装在centOS7以上 [root@hadoop-bigdata01 ~]# yum i ...

  10. Tkinter Bitmaps

       Tkinter Bitmaps: 你会使用这个属性显示一个位图.有以下类型的可用位图. 你会使用这个属性显示一个位图.有以下类型的可用位图.: "error" "g ...