在我们的web page,特别是移动设备上,太多的angular $watch将可能导致性能问题。这篇文章将解释如何去移除额外的$watch提高你的应用程序性能。

$watch如果不再使用,我们最好将其释放掉,在angular中我们可以自由的选择在什么时候将$watch从$watch列表中移除。

让我们来看个示例:

app = angular.module('app', []);

app.controller('MainCtrl', function($scope) {

$scope.updated = 0;

$scope.stop = function() {

textWatch();

};

var textWatch = $scope.$watch('text', function(newVal, oldVal) {

if (newVal === oldVal) { return; }

$scope.updated++;

});

});
<body ng-controller="MainCtrl">

<input type="text" ng-model="text" /> {{updated}} times updated.

<button ng-click="stop()">Stop count</button>

</body>

$watch函数会返回一个释放$watch绑定的unbind函数。所以当我们不再需要watch改变的时候,我们可以easy的调用这个函数释放$watch。

由静态数据构成的页面

让我假想我们要创建一个会议session预约的页面,页面像如下结构:

app.controller('MainCtrl', function($scope) {

$scope.sessions = [...];

$scope.likeSession = function(session) {

// Like the session

}

});
<ul>

<li ng-repeat="session in sessions">

<div class="info">

{{session.name}} - {{session.room}} - {{session.hour}} - {{session.speaker}}

</div>

<div class="likes">

{{session.likes}} likes! <button ng-click="likeSession(session)">Like it!</button>

</div>

</li>

</ul>

假想这是一个大型的预约,一天会有30个sessions。这里会产生多少个$watch?这里每个session有5个绑定,额外的ng-repeat一个.这将会产生151个$watch。这有什么问题?每次用户“like”一个session,angular将会去检查name是不是被改变(其他的属性也相同)。

问题在于除了例外的“like”外,所有的数据都是静态数据,这是不是有点浪费资源?我们能够100%保证我们的数据不会改变,既然这样为什么我们让angular要去检查是否改变呢?

解决方案很简单。我们移除永远不会改变的$watch。$watch在第一非常重要,它用静态信息生产更新了我们的DOM结构,但是在此之后,它监听了一个永远不会被改变的常量,这明显是很大的浪费资源。

如果你相信我了的话,会我们能怎么去解决呢?幸运的是,这有个nice guy在我们之前也问了自己这个问题,并创建了一系列的指令实现这个:Bindonce.

Bindonce

Bindonce是一系列绑定但是不带watch的指令集,这很完美的符合了我们的需求。

让我们用Bindonce重新实现我们的view:

<ul>

<li bindonce ng-repeat="session in sessions">

<div class="info">

<span bo-text="session.name"></span> -

<span bo-text="session.room"></span> -

<span bo-text="session.hour"></span> -

<span bo-text="session.speaker"></span>

</div>

<div class="likes">

{{session.likes}} likes! <button ng-click="likeSession(session)">Like it!</button>

</div>

</li>

</ul>

为了让示例能够工作,我们必须引入bindonce到我们的应用程序。

app = angular.module('app', ['pasvaz.bindonce']);

在这里我们将angular表达式换位了bo-text指令。这指令将会绑定我们的model,知道更新DOM,然后去掉绑定。这样我就可以显示view但是移除不必要的饿绑定了。

在此例中每个session只有一个$watch绑定,所以这里用31个绑定替代了151个绑定。我们正确的使用bingonce将会为我们的应用程序大量减少$watch绑定。

总结

当我们的性能无法避免的需要优化的时候,bindonce能够帮助脱离$watch的性能瓶颈。在bindonce中还有很多的指令,我可以从这里搜索到:https://github.com/Pasvaz/bindonce#attribute-usage

angularjs移除不必要的$watch的更多相关文章

  1. Angularjs中文版本开发指南发布

    从本人开始在写关于Angularjs的文章开始,也算是见证了Angularjs在国内慢慢的火起来,如今的Angularjs正式如日中天.想知道为什么Angularjs会这么火,请移步angularjs ...

  2. 玩转spring boot——结合AngularJs和JDBC

    参考官方例子:http://spring.io/guides/gs/relational-data-access/ 一.项目准备 在建立mysql数据库后新建表“t_order” ; -- ----- ...

  3. (转)构建自己的AngularJS,第一部分:Scope和Digest

    原翻译链接:https://github.com/xufei/Make-Your-Own-AngularJS/edit/master/01.md 原文链接:http://teropa.info/blo ...

  4. angularJS实用的开发技巧

    一.开端 真的是忙完这一阵子就可以忙下一阵子了啊... 最近在做一个angularJS+Ionic的移动端项目...记录一些技巧,方便自己以后查阅,也方便需要的人可以看一看...^_^ 二.基础原则了 ...

  5. AngularJS 动画

    AngularJS 提供了动画效果,可以配合 CSS 使用. AngularJS 使用动画需要引入 angular-animate.min.js 库. <script src="htt ...

  6. AngularJs学习

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  7. 什么是Angularjs

    AngularJs(后面就简称ng了)是一个用于设计动态web应用的结构框架.首先,它是一个框架,不是类库,是像EXT一样提供一整套方案用于设计web应用.它不仅仅是一个javascript框架,因为 ...

  8. AngularJS 源码分析2

    上一篇地址 本文主要分析RootScopeProvider和ParseProvider RootScopeProvider简介 今天这个rootscope可是angularjs里面比较活跃的一个pro ...

  9. AngularJS移动开发中的各种坑

    捂脸,辛酸泪ing...... 本文主要涉及部分在移动设备上特有的问题. 相对来说,Jquery侧重DOM操作,AngularJS是以视图模型和双向绑定为核心的. DOM操作的问题 避免使用 jQue ...

随机推荐

  1. 创建nim+安装vioc分区

    一.搭建nim服务器 1.安装须知 安装nim软件包,client随系统默认安装,这里需要安装的是bos.sysmgt.nim.master和bos.sysmgt.nim.spot,即bos.sysm ...

  2. 即时通讯 TCP UDP

    TCP协议与UDP协议的区别    首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...

  3. 禁止VMware虚拟机与Host的时间同步

    禁止VMware虚拟机与Host的时间同步 1. 查看虚拟机是否安装了 VMware Tools, 如果有安装,则将 VMware Tools 属性窗口的“选项”-->“其他选项”中“虚拟机与宿 ...

  4. NGUI Material Shader SetFloat 不起作用

    通常情况下,我们在Unity3d种可以通过material.SetFloat(name, xxx) 修改参数来达到我们的Material[Shader]的效果. 但是在 NGUI 的UITexture ...

  5. Ajax Step By Step4

    第四,[$.ajax()] $.ajax()是所有 ajax 方法中最底层的方法,所有其他方法都是基于$.ajax()方法的封装.这个方法只有一个参数,传递一个各个功能键值对的对象. $.ajax() ...

  6. python第一天基础1-2

    python入门 1 第一个python代码: 在linux上创建第一个.py脚本 #!/usr/bin/env python #-*- coding:utf-8 -*- print "He ...

  7. 编译 wxWidgets-3.0.2 on Mac OS X Yosemite 出错?!的解决方法

    tar -zxf wxWidgets-3.0.2.tar.bz2   //解压 //三部走 ./configure ./make 提示webKit出错 原因:有人偷懒,没试编译就发布了. 解决:找到. ...

  8. HttpWebRequest 请求数据

    string fullUrl = "http://vip.AAA.cn/PreviewInterfaceAction.action?code=vip0008&data_digest= ...

  9. 关于js单页面实现跳转原理以及利用angularjs框架路由实现单页面跳转

    还记得我们刚开始学习html时使用的锚节点实现跳转吗? <a href="#target">我想跳转至目标位置</a> <p>第一条</p ...

  10. ubuntu 安装JAVA jdk的两种方法:

    ubuntu 安装jdk 的两种方式: 1:通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 使用pp ...