Page 441 - AngularJS权威教程
P. 441

32.2 优化$digest 循环    421


                                                                                                     19


                       第32章                                                                          20

                                        优化Angular应用
                                                                                                     21


                                                                                                     22


                  显然,Angular在开发期间就做了很大的优化,但是在性能方面它是如何定位的呢?为了让                                        23
              它尽可能快,我们还能做些什么呢?
                  对于大多数Web应用程序而言,Angular的速度已经足够快了,因此无需特意优化它的性能。                                      24
              当你的应用程序变慢或者表现不佳时,才需要动手优化Angular应用。
                                                                                                     25
              32.1 优化什么
                                                                                                     26
                  为了了解应该集中优化应用的哪些部分,需要理解Angular在幕后发生了什么事情。对于任
              何应用程序,我们都应该从问题的起因开始。
                                                                                                     27
              32.2 优化$digest 循环
                                                                                                     28
                  查找性能问题,最明显的地方是从$digest循环开始。简而言之,Angular通过运行一个监控列
              表来跟踪实时数据绑定。页面上每一个可能改变的实时数据都有一个监控函数。                                                    29

                      第24章详细讨论了$watch列表和$digest循环。
                                                                                                     30
                  每个监控列表都可能导致$digest循环花更多的时间完成渲染,因为Angular需要跟踪值,同
              时检查它在每个循环中是否发生变化。
                                                                                                     31
                  限制不必要的监控数量会获得最大的性能提升。此外,双向数据比较应尽量简单,这样会带
              来更多的性能提升,因为这样浏览器可以快速地检查它们。
                                                                                                     32
                  在你的应用中,你应该留心双向数据绑定的数量,对于页面上每个$digest循环中的数据绑
              定不应该超过2000个。
                                                                                                     33
                  有时,甚至不需要在应用程序中运行完整的$digest循环。想象一下,有个一秒钟查询服务
              器多次的轮询。如果我们收到一个websocket事件,触发一个完整的digest循环来处理每条消息,
              这将会得到相当慢的应用程序。                                                                         34

                      推荐使用websocket,因为它们在生产中更加友好并且不容易出错。
                                                                                                     35
                  app.factory('poller', function($rootScope, $http) {
                      var pollForEvent = function(timeout) {
                          $http.get('/events')                                                       36
                          .success(function(data) {
   436   437   438   439   440   441   442   443   444   445   446