`
wx1568444409
  • 浏览: 14635 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

angular1.x 优化问题

 
阅读更多

AngularJS作为强大的前端MVVM框架,虽然已经做了很多的性能优化,但是我们开发过程中的不当使用还是会对性能产生巨大影响。

 

下面提出几点优化的方法:

1. 使用单次绑定符号{{::value}}

AngularJS的性能优化方法之一是减少双向绑定。我们知道AngularJS的双向绑定是通过为每个需要双向绑定的数据对象添加$$watchers,一旦某个scope的数据发生了更新,就触发脏检测($digest),深度优先遍历所有scope对象的$$watchers值的old/new value是否发生变化。所以在开发过程中,我们都要小心判断创建出的每个$$watchers是否有必要。对于只需要更新一次,以后不管数据层如何变化都不需要更新的数据,使用连续两个冒号即可在在$$watchers列表中将这个值删除,即减少了$digest脏检测循环。

2. ng-repeat优化

第一种方式虽然减少了脏检测的次数,但是单次绑定的数据毕竟少数,可能加完单次绑定,性能提升并没有太大。如果我们的代码中使用了ng-repeat,并且list数量很大时,我们的性能会有很大下降,在移动端尤为明显。下面几点是对ng-repeat指令的优化。

  • 使用limitTo来减少第一次加载列表元素的数量,以提高初始化页面的速度。我们也许有上百上千条数据要显示,但是屏幕的大小毕竟有限,呈现在用户眼前的可能就是个1280x800或者360x640大小的屏幕,那我们可以先加载用户所能看到几个十几个列表。limitTo属性就提供了这样的功能。
  <li ng-repeat="mail in mails |limitTo:loadMailLimitTo"></li>
  • 使用track by属性。比如我们有下面一段代码
<ul>
    <li ng-repeat="mail in mails">
        {{mail.id}}:{{mail.title}}
    </li>
</ul>

如果我们想更新mails里面的值,我们可能会这么做:

1

$scope.mails = newMailListFromServer;

上一行代码会告诉ng-repeat去删除掉所有的li元素,再去重新生成一套新的li,这意味着大量的DOM操作,尤其当li元素里面有 复杂的逻辑判断和双向绑定数据。这是因为ng-repeat在创建时会给每个mail加上$hashkey属性,并时时跟踪,一旦mails元素替换成服务器 返回的对象,即时他们完全一样,由于他们没有$hashkey,所以ng-repeat不会知道他们是一样的元素。而通过如下的改动:

<li ng-repeat="mail in mails track by mail.id"></li>

ng-repeat会跟踪我们创建的mail.id去判断是否为新的元素。这样就减少了大量的DOM删减添加操作。
需要注意的是,如果limitTo和track by一起使用的时候,需要把track by放到最后,如

<li ng-repeat="mail in mails | limitTo:loadMailLimitTo track by mail.id"></li>
  • 如果有引入ionic框架,可以使用collection-repeat替代ng-repeat。

collection-repeat是ionic框架自己的一套显示list的指令,原理在于不论list有多大,页面最多只有一定数量的item,这个item数量的大小是通过屏幕高度和单个item的高度计算出来的。滑动列表时通过更新item元素的页面内容和位置来呈现所有的items。所以在大数量级的list呈现上,collection-repeat会比ng-repeat性能好很多。但是需要注意的是,由于collection-repeat是通过时时更新滑动位置的item内容来实现的,所以在item内部使用第一个方法的单次绑定方式,滑动后会造成页面混乱的情况。

 

3. 减少html页面中的filter

原因是每当filter执行时,都会走两次$digest cycle,一次是scope中有数据改动,一次是查看是否有更多的改动需要更新数据。当数据量很大时对性能会有很大影响。我们可以在初始化时就格式化好数据,比如赋值到view层之前,在我们的js代码里使用angular提供的$filter provider来预处理我们的数据。

 

4. ng-if替代ng-show/ng-hide

原因是ng-if与ng-show/ng-hide的不同之处在于,ng-if在等于false时会把元素从DOM中移除,所以所有绑在该元素上的handler会一同失效。而ng-show/ng-hide不会移除DOM元素,而是使用css style去隐藏/显示DOM元素,所以handlers会一直存在。

 

5. $scope.$apply()和$scope.$digest()

我们会用到上面两种去执行一次脏检测,刷新页面数据。区别就是$scope.$apply()会从$rootscope开始,深度优先遍历执行$digest循环,而$scope.$digest会从当前scope开始,往下层scope遍历脏检测。如果只是期望当前scope的数据更新,而不涉及到parent $scope,则可以使用$scope.$digest()。

 

6. angular animate

如果我们的项目引入了angular-animate.js的模块,那么在大部分使用了指令的元素上,animate里面的代码都会被执行,不管当前元素是否有应用css动画样式。这对我们页面上如果有大量数据频繁滑动,隐藏显示的时候会有比较明显的性能问题。如果我们对当前scope并没有渐入渐出等动画效果的时候,可以在当前scope初始化时加上$animate.enabled(false);当然,我们也可以对某个元素进行禁止动画的动作:$animate.enabled(element, false);

 

7. ionicSlideBox优化(只针对使用了ionic框架的项目)

  • 初始化slidebox时先初始化显示中间的首先显示在用户面前的slide,其他的slide可以在$timeout里面延迟初始化。思想和ng-repeat的limitTo比较类似。
  • slidebox的滑动速度在ionic框架中默认速度是300ms滑完一个slide,通过改变这个速度来使滑动更快速。

转载于:https://my.oschina.net/qianliyixianqian/blog/891154

分享到:
评论

相关推荐

    angular1.x按需加载js

    "Angular 1.x按需加载js"是一种优化策略,旨在解决这个问题,通过动态加载只有在用户需要时才会用到的模块,从而减少初始页面加载的时间。 Angular 1.x本身并不直接支持按需加载(又称懒加载)。但可以通过第三方库...

    angular1.x 移动端开发webapp.zip

    针对移动端开发,Angular 1.x提供了多种优化策略和工具,使得开发者可以创建高性能、响应式的移动Web应用。 1. **模块化**:Angular 1.x的核心概念之一是模块(Module),它允许开发者将应用程序的不同部分组织成...

    01+Angular4.x+angular5.x介绍以及和vue、react对比

    Angular 4.x 和 5.x 是该框架的两个重要版本,它们在性能优化、模块化、构建速度等方面都有显著改进。 **Angular 4.x** 1. **更快的构建速度**:Angular 4.x 引入了 AOT(Ahead-of-Time)编译,使得应用加载速度更...

    Angular1.x安装与配置1

    Angular1.x,作为AngularJS的一个早期版本,是一个由Misko Hevery和Adam Abrons于...其后的版本,如Angular 2+,在很多方面进行了优化和改进,但Angular1.x的许多基础概念和原理仍然对理解现代Angular框架至关重要。

    基于Angular1.x的矩阵组件库_JavaScript_CSS_下载.zip

    **基于Angular1.x的矩阵组件库** AngularJS是Google维护的一款强大的前端JavaScript框架,主要用于构建单页应用程序(SPA)。在1.x版本中,它引入了许多创新特性,如数据绑定、依赖注入、指令系统等,极大地提高了...

    Angular1.X框架模板

    **Angular 1.x 框架模板** Angular 1.x 是 Google 推出的一个前端 JavaScript 框架,主要用于构建动态、数据驱动的 Web 应用。它提供了一种声明式的方式来构建用户界面,简化了单页应用(SPA)的开发。在"Angular1....

    angularproject.zip

    Angular 1.x是Angular的第一个主要版本,它引入了MVVM(Model-View-ViewModel)模式,简化了Web应用的开发。Angular的核心特性包括数据绑定、指令系统、依赖注入和服务等。 1. 数据绑定:Angular 1.x的双向数据绑定...

    ngVue:在Angular 1.x中使用Vue2组件

    ngVue可以在现有的Angular应用程序中使用,并有助于将应用程序的视图部分从Angular 1.x迁移到Vue 2。 其动机类似于ngReact的动机: 由于页面上有大量的作用域观察器,因此AngularJS应用程序存在性能瓶颈,但是...

    webpack构建angular1x

    Webpack 提供了解决这个问题的方法,通过将Angular 1.x应用中的模块进行智能打包,优化加载速度并提高开发效率。 首先,要构建Angular 1.x项目,我们需要安装Webpack和相关的插件。在命令行中运行以下命令: ```...

    Packt.Angular.2.Cookbook.2nd.Edition.2017

    - **简介**:介绍了如何将 Angular 1.x 的指令(component 或 directive)重构为 Angular 2 的组件。 - **准备工作**: - 需要了解 Angular 1.x 和 Angular 2 的基础知识。 - 准备一个现有的 Angular 1.x 应用程序。...

    es6+angular1.X+webpack 实现按路由功能打包项目的示例

    这些技术的结合旨在解决大型应用的模块化和打包问题,特别是针对Angular1.x的路由功能。 **ES6** 是ECMAScript的第六版,引入了许多新的语法特性,如箭头函数、类、模块等,使得JavaScript编写更加简洁和模块化。在...

    angular1.6.5.rar

    本资料主要聚焦于AngularJS 1.6.5版本,它是AngularJS 1.x系列的一个稳定版本,包含了众多优化和改进,旨在提升性能并减少潜在的bug。接下来,我们将深入探讨这一版本的关键特性、核心概念以及实际应用。 一、...

    angle-admin-v3.5.1(angular-2.x+版)

    Angular 2.x 是Google推出的第二代Angular框架,相较于第一代有显著改进,它采用了全新的设计和架构,支持TypeScript,并优化了性能。在Angular 2.x中,主要知识点包括: 1. **模块化(Modules)**:Angular 2.x...

    angular-1.8.2.rar

    Angular 1.8.2是Angular 1.x系列的一个稳定版本,虽然Angular 2及更高版本已经发布,但Angular 1.x依旧在许多项目中广泛应用,尤其对于那些需要维护旧项目的团队而言,1.8.2的更新显得尤为关键。此版本的主要焦点...

    webimapp_angular:Angular1.x +离子

    【描述】"webimapp_angular Angular1.x +离子" 提示这个项目是将Angular1.x的强大力量与Ionic的移动端优化功能相结合,可能旨在开发一个具有即时通讯(IM)功能的移动应用。Angular1.x提供了数据绑定、依赖注入和...

    smartadmin.angular.1.8.2

    这个版本号1.8.2表明它是在Angular 1.x系列中的一个稳定版本,发布时Angular 1.x仍然广为使用,尽管现在Angular已经更新到了更高级别的版本。 SmartAdmin是一款流行的开源项目,它提供了丰富的UI组件、示例页面以及...

    详解如何使用webpack+es6开发angular1.x

    本篇文章将探讨如何利用webpack和ES6的特性来优化Angular1.x的开发流程,特别是实现动态加载,提高项目的性能和可维护性。 **1. Webpack配置** Webpack 是一个强大的模块打包工具,它可以将各种资源(如JavaScript...

    angular-toast.0.4.x.zip

    "angular-toast.0.4.x.zip" 是一个包含AngularJS 1.2.*版本兼容的angular-toast组件的压缩包。这个组件主要用于在AngularJS应用中显示通知或提示信息,为用户提供交互反馈。AngularJS是Google维护的一个前端...

    kanban-angular:使用 angular 1.x 版本构建的看板应用程序

    **kanban-angular: 使用Angular 1.x 构建看板应用程序** `kanban-angular` 是一个基于Angular 1.x框架开发的看板应用程序,它利用了AngularJS的强大功能来实现敏捷开发中的看板管理功能。看板作为一种可视化工具,...

Global site tag (gtag.js) - Google Analytics