成也绑定,败也绑定,AngularJs雄霸天下

  前端框架,说白了,就是一系列HTML/CSS/JavaScript组件的集合,我们可以在设计时使用它们,让我们花最少的力气去实现符合标准的网站。先让我们来看下2015年前排行榜。

很显然,AngularJs是当今最热门的一个前端框架,它能快速构建企业级的web应用,已经被用于google的多款产品,有MVVM,依赖注入,自动化双向数据绑定,模块化等特性,

下面简要的介绍一下对这个框架的理解。

一:它与Jquery的区别

jquery,我想大多数前端初学者比较早接触的一种东西,总的来说就是一个库,形象的说这是个工具箱子,里面有各种工具,你要想什么工具,就自己去里面取,毫无疑问,使用jquery确实可以方便省事很多,jquery说白了,其核心就是进行DOM操作,像我们之前一直惯用的$("#..")来表示引用一个id值为..的标签,其大致核心代码如下。

 1 Base.prototype.find = function (str) {
 2     var childElements = [];
 3     for (var i = 0; i < this.elements.length; i ++) {
 4         switch (str.charAt(0)) {
 5             case ‘#‘ :
 6                 childElements.push(this.getId(str.substring(1)));
 7                 break;
 8             case ‘.‘ :
 9                 var temps = this.getClass(str.substring(1), this.elements[i]);
10                 for (var j = 0; j < temps.length; j ++) {
11                     childElements.push(temps[j]);
12                 }
13                 break;
14             default :
15                 var temps = this.getTagName(str, this.elements[i]);
16                 for (var j = 0; j < temps.length; j ++) {
17                     childElements.push(temps[j]);
18                 }
19         }
20     }
21     this.elements = childElements;
22     return this;
23 }

就是用javascript进行一系列的封装,然而,这种模式有几个比较致命的缺点,就是效率比较低,解析速度比较慢。然而AngularJs使用得当,可以避开这点。比如想要做一个根据checkbox的状态隐藏显示某一个元素,使用AngularJs,只需要几行代码就可以,如

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

具体代码没有详细列出,但是使用jquery的话,就得需要写很多行代码,就是要拿到某一个节点和属性,查看它的值,做这个操作那个操作。当然,不可否认的是jquery也是有它的优势,严格上来说两者并没有什么可比性。如果是jquery是一个工具箱,那么angularjs就是一个框架,你要用这个框架去找工具,打比方说,这个框架将下水道都已经安装好了,但是想要有水,就必须得接个水龙头,这点别人帮不了你,这个水龙头就是一个工具,这个工具你的自己去找。

二:最炫的优点之双向数据绑定

说数据绑定是AngularJs最炫酷的优点一点也不过分,  可以巧妙的实现避免书写大量的初始代码而节省大量的时间,它采用了MVC的基本思想,但是又不局限于此,它在这个的基础上有进一步改善,确确的说它是一种MVVM模式,MVVM,其英文的全称为Model-View-View-Model,相信只要不是英语白痴的人都知道这几个单词的意思,通俗的讲就是Model的改变会影响View层,View层的改变又会反过来隐影响Model层,说道这里,可能大部分同学还是比较模糊,这些都是什么鬼东西,那么接下来我就以两个实例来演示一遍

 1 <!DOCTYPE HTML>
 2 <html ng-app>
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 5 <title>无标题文档</title>
 6 <script src="angular.min.js"></script>
 7 <script>
 8
 9 function Aaa($scope,$timeout){
10     $scope.name = ‘hello‘;
11     $scope.show = function(){
12         $scope.name = ‘九天玄男‘;
13     };
14
15 }
16
17 </script>
18 </head>
19
20 <body>
21 <div ng-controller="Aaa" ng-click="show()">
22     <p>{{name}}</p>
23 </div>
24
25 </body>
26 </html>

当我一点击页面上出现的hello时,它就会变成"九天玄男"四个字,当然这其中调用了一个ng-click指令,V层就是{{name}},当M中的name的值改变时,其值就是发生改变,这就是所谓的M影响了View,.下面我们再来看一个关于View影响Model的实际例子。

 1 <!DOCTYPE HTML>
 2 <html ng-app>
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 5 <title>无标题文档</title>
 6 <script src="angular.min.js"></script>
 7 <script>
 8
 9 function Aaa($scope,$timeout){
10     $scope.name = ‘hello‘;
11 }
12
13 </script>
14 </head>
15
16 <body>
17
18 <div ng-controller="Aaa">
19     <input type="text" ng-model="name">
20     <p>{{name}}</p>
21 </div>
22
23 </body>
24 </html>

当我们向View中的input输入“九天玄男”四个字时,我们会比较惊讶的发现,下面也跟着显示,而下面中的{{name}}是来源于Model中的数据,所以这就是所谓的View影响了Model。

三:几种比较常用的功能

1:ng-repeat标签

使用这个标签可以实现像ul这些标签进行完美的结合,进行迭代输出。我们同样也是可以实现指定输出的顺序,选择奇数行显示还是偶数行显示等这些功能,其扩展部分主要有$even,ng-repeat-start等。

 1 <!doctype html>
 2 <html ng-app=‘App‘>
 3 <head>
 4 <meta charset="utf-8">
 5 <title>无标题文档</title>
 6 <style>
 7 .active1{
 8     background:red;
 9     }
10 .active2{
11     background:blue;
12     }
13 </style>
14 <script src="angular.min.js"></script>
15 <script>
16 var m1=angular.module(‘App‘,[]);
17 m1.controller(‘Aaa‘,[‘$scope‘,function($scope){
18     $scope.dataList=[
19         ‘aaa‘,‘bbb‘,‘ccc‘
20     ]
21     }])
22 </script>
23 </head>
24
25 <body>
26 <div ng-controller="Aaa">
27 <li class="{{$even?‘active1‘:‘active2‘}}" ng-repeat=‘data in dataList‘>{{data}}</li>
28 </div>
29 </body>
30 </html>

使用以上这aaa,bbb,ccc,显示出来并加入相应的样式。

2:ng-style,控制css

可以先在Model中写明style,然后在View中对其进行调用。

 1 <!DOCTYPE HTML>
 2 <html ng-app="myApp">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 5 <title>无标题文档</title>
 6 <style>
 7 .red{ background:red;}
 8 .yellow{ background:yellow;}
 9 </style>
10 <script src="angular.min.js"></script>
11 <script>
12
13 var m1 = angular.module(‘myApp‘,[]);
14 m1.controller(‘Aaa‘,[‘$scope‘,function($scope){
15     $scope.text = ‘hello‘;
16     $scope.style = "{color:‘red‘,background:‘yellow‘}";
17     $scope.sClass = "{red:true,yellow:true}";
18     $scope.url = "http://www.baidu.com";
19 }]);
20
21
22
23 </script>
24 </head>
25
26 <body>
27 <div ng-controller="Aaa">
28     <div ng-class="{{sClass}}">{{text}}</div>
29     <div ng-style="{{style}}">{{text}}</div>
30     <a ng-href="{{url}}">a</a>
31     <a ng-attr-href="{{url}}" ng-attr-class="" ng-attr-style="">a</a>
32 </div>
33 <script>
34 //alert(1);
35 </script>
36 </body>
37 </html>

3:ng-model标签

对于这个标签我们应该是已经很熟悉了,前面讲解的双向数据绑定中也有提及,它的主要作用就是实现动态绑定,下面就以收银界面来显示这个标签所起到的作用。

 1 <!DOCTYPE HTML>
 2 <html ng-app>
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 5 <title>无标题文档</title>
 6 <script src="angular.min.js"></script>
 7 <script>
 8
 9 function Aaa($scope,$timeout){
10     $scope.iphone = {
11         money : 5,
12         num : 1,
13         fre : 10
14     };
15     $scope.sum = function(){
16         return $scope.iphone.money * $scope.iphone.num;
17     };
18
19     $scope.$watch($scope.sum,function(newVal,oldVal){
20         $scope.iphone.fre = newVal >= 100 ? 0 : 10;
21
22     });
23
24 }
25
26 </script>
27 </head>
28
29 <body>
30
31 <div ng-controller="Aaa">
32     <p>价格:<input type="text" ng-model="iphone.money"></p>
33     <p>个数:<input type="text" ng-model="iphone.num"></p>
34     <p>费用:<span>{{ sum() | currency:‘¥‘ }}</span></p>
35     <p>运费:<span>{{iphone.fre | currency:‘¥‘}}</span></p>
36     <p>总额:<span>{{ sum() + iphone.fre | currency:‘¥‘}}</span></p>
37 </div>
38
39 </body>
40 </html>

4:$http对象

众所周知,jquery中有$ajax对象,它使用的是异步请求,但是AngularJs它不仅也使用了异步请求,更是将它用的“丧心病狂”,所有的$http都是使用异步。下面就以模拟百度搜索界面来展示该功能。

 1 <!DOCTYPE HTML>
 2 <html ng-app="myApp">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 5 <title>无标题文档</title>
 6 <script src="angular.min.js"></script>
 7 <script>
 8
 9 var m1 = angular.module(‘myApp‘,[]);
10 m1.controller(‘Aaa‘,[‘$scope‘,‘$http‘,‘$timeout‘,function($scope,$http,$timeout){
11     var timer = null;
12     $scope.data = [];
1314      $scope.change = function(name){
15        $timeout.cancel(timer);
17
18         timer = $timeout(function(){
19
20             $http({
21                 method : ‘JSONP‘,
22           url : ‘https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd           =‘+name+‘&cb=JSON_CALLBACK‘
23             }).success(function(data){
24                 //console.log(data);
25                 $scope.data = data.s;
26             });
27
28         },500);
30     };
31 }]);
32
33 </script>
34 </head>
36 <body>
37 <div ng-controller="Aaa">
38     <input type="text" ng-model="name" ng-keyup="change(name)">
39     <input type="button" ng-click="change(name)" value="搜索">
40     <ul>
41         <li ng-repeat="d in data">{{d}}</li>
42     </ul>
43 </div>
44 </body>
45 </html>

巧妙的使用$http,就可以模拟百度的搜索界面,,只要输入a,就会显示相关数据。

四:败也绑定

通过以上的介绍,尤其是最后的一个关于模拟百度搜索的,各位同学们有没有觉得AngularJs吊炸天有没有,但是凡事都是有利弊,在其数据绑定的背后,其实也是有很多时候不太方便的,因为它页面绑定的非常厉害,如果一个项目中需求发生改变时,很多数据都是绑定的,所以就会牵一发而动全身,如果这个时候进行解绑,解绑后就会引起很多其他地方的问题。而且,除此之外,它也是有一定的局限性,比如像游戏之类的网站,这就不可避免要使用到大量的DOM操作,这个时候如果使用AngularJs的话,就会引起很多的不方便,同样的,如果是太多简单的页面,也不适合使用这个框架。当然,不可否认的一点就是它确实是有很多的优势。国内比较许多比较大型的网站都是使用到这个框架。据说,曾经一个网站用了一万七千行代码,使用了这个框架之后,变成了一千多行代码。所以,我们也是学会去适当的使用这个框架。

五:小总结

因为本人是最近才学习的AngularJs,所以很多地方理解的还不是很深,像这个框架的其他特性,像依赖注入这些,只是初步学习而已,所以很多地方都没有进行细讲,接下来等自己忙完了这阵子之后,我会更进一步的去学习AngularJs,毕竟这个是一个前端开发者在未来的道路上求职的一把利器,同时,伴随着其Angular2,这个版本的出现,很多知识都会进行改变,我们所能做的就是打好基础,进一步学习。最后在陈述一遍,由于本人还只是个前端的菜鸟,对于其中的相关知识,可能理解的还不是很透彻,各路大神也千万不要喷我,前端的世界更新的太快了,想要存活下去,就必须不断的逼迫自己去学习更多新的东西与技术。

时间: 2024-10-10 05:11:19

成也绑定,败也绑定,AngularJs雄霸天下的相关文章

ng1中 如何用双向绑定 实现单向绑定的初始时不显示双括号效果?

ng1中 如何用双向绑定 实现单向绑定(ng-bind就可以不显示{{}})的初始时不显示双括号效果? AngularJS 实例 页面加载时防止应用闪烁: <div ng-app=""> <p ng-cloak>{{ 5 + 5 }}</p> </div> 尝试一下 » 定义和用法 ng-cloak 指令用于在 AngularJS 应用在加载时防止 AngularJS 代码未加载完而出现的问题. AngularJS 应用在加载时,文档可能

前期绑定和后期绑定

程序绑定的概念:绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定 静态绑定:在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现.例如:C.针对java简单的可以理解为程序编译期的绑定:这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定 动态绑定:后期绑定:在运行时根据具体对象的类型进行绑定.若一种语言实现了后期绑定,同时必 须提供一些机制,可在运行期间判断对

什么样的局域网需要IP-MAC绑定?IP-MAC绑定的好处。

1. 为什么要进行IP-mac绑定? IP-MAC绑定是网络管理的一个重要手段,在局域网内启用IP-MAC绑定,可以给您带来如下好处: 只有通过绑定的设备才可以接入网络,从而有效的防止了私接设备. 大部分上网和流控策略都是基于IP地址的,需要绑定IP和MAC才可以更好的应用上网策略. 实现有效的上网记录和上网统计.如果不绑定,那么记录统计不能有效的定位到具体用户. 节省IP资源,防止IP盗用. 减少ARP攻击,杜绝IP地址冲突,从而提高网络的稳定性. 所以,对于企业的办公局域网来说,IP-MAC

解决局域网络控制、限网 arp绑定及arp绑定问题解决

当你在一个有n多人共用一个wifi时,避免不了的问题就是抢网速,那么有人就会想办法让自己多点网速,那么就会有人试图去控制局域网,一般的办法就是进行arp欺骗,以控制别人的网速.不用担心,我们可以静态的绑定网关ip和mac的对应关系,让它欺骗不了,我们可以这样做: Win7下绑定IP和MAC地址提示"ARP项添加失败:拒绝访问 我们都知道直接执行arp -s 命令即可绑定IP和MAC地址,但是在Win7下会遇到不能运行arp -s 进行静态mac绑定的情况,提示"ARP 项添加失败: 拒

背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 绑定 TemplateBinding 绑定 与 RelativeSource 绑定 与 StaticResource 绑定 示例1.演示 TemplateBinding 的用法Bind/TemplateBindingDemo.xaml <Page x:Class="Windows10.Bind.TemplateBindingDemo" xmlns="http://schemas.microsof

背水一战 Windows 10 (18) - 绑定: 与 Element 绑定, 与 Indexer 绑定, TargetNullValue, FallbackValue

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 绑定 与 Element 绑定 与 Indexer 绑定 TargetNullValue - 当绑定数据为 null 时显示的值 FallbackValue - 当绑定失败时显示的值 示例1.演示如何与 Element 绑定Bind/BindingElement.xaml <Page x:Class="Windows10.Bind.BindingElement" xmlns="http://sc

vb小菜一枚--------早期绑定和后期绑定

早期绑定和后期绑定 Visual Studio 2005 其他版本 将对象分配给对象变量时,Visual Basic 编译器会执行一个名为 binding 的进程.如果将对象分配给声明为特定对象类型的变量,则该对象为“早期绑定”.早期绑定对象允许编译器在应用程序执行前分配内存以及执行其他优化.例如,下面的代码片段将一个变量声明为 FileStream 类型: VB ' Create a variable to hold a new object. Dim FS As System.IO.File

【javaScript】早绑定和迟绑定

javaScript会在调用时会设置执行上下文"this"的值. 一些经常使用的错误例子 我们举一个例子,给一个Menu构造函数,来接受一个元素来创建一个菜单. function Menu(elem){ //... } //使用 var elem = document.getElementById('something') // a DOM element var menu = new Menu(elem); 当我们在构造函数里调用setTimeout时,你也许想引用这个menu对象,

KnockoutJS 3.X API 第四章 数据绑定(3) 控制流if绑定和ifnot绑定

if绑定目的 if绑定一般是格式是data-bind=if:attribute,if后所跟属性或表达式的值应为bool值(也可以是非bool值,当非空字符串时则为真),if绑定的作用与visible绑定的作用类似.可控制DOM的显示与隐藏,不一样的地方是,if绑定是物理删除或添加DOM元素. 示例1 该例展示IF绑定的动态删除添加DOM: Display message Here is a message. Astonishing. UI源码: <label><input type=&q