精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

對AngularJS進行性能調優的7個建議

開發 后端 前端
AnglarJS作為一款優秀的Web框架,可大大簡化前端開發的負擔。近日Sebastian Fröstl在一篇博文《AngularJS Performance Tuning for Long Lists》中表示AnglarJS在處理包含復雜數據結構的大型列表時,其運行速度會非常慢。他在文中同時分享了解決方案。

AnglarJS作為一款優秀的Web框架,可大大簡化前端開發的負擔。近日Sebastian Fröstl在一篇博文《AngularJS Performance Tuning for Long Lists》中表示AnglarJS在處理包含復雜數據結構的大型列表時,其運行速度會非常慢。他在文中同時分享了解決方案。下面為該文的譯文。

AnglarJS很棒,但當處理包含復雜數據結構的大型列表時,其運行速度就會非常慢。這是我們將核心管理頁面遷移到AngularJS過程中遇到的問題。這些頁面在顯示500行數據時本應該工作順暢,但首個方法的渲染時間竟花費了7秒,太可怕了。

后來,我們發現了在實現過程中存在兩個主要性能問題。一個與“ng-repeat ”指令有關,另一個與過濾器有關。

下文將分享我們通過不同的方法解決性能問題的經驗,希望可以給你帶來啟示。

一、AngularJS 中的ng-repeat在處理大型列表時,速度為什么會變慢?

AngularJS中的ng-repeat在處理2500個以上的雙向數據綁定時速度會變慢。這是由于AngularJS通過“dirty checking”函數來檢測變化。每次檢測都會花費時間,所以包含復雜數據結構的大型列表將降低你應用的運行速度。

二、提高性能的先決條件

時間記錄指令

為了測量一個列表渲染所花費的時間,我們寫了一個簡單的程序,通過使用“ng-repeat”的屬性“$last”來記錄時間。時間存放在TimeTracker服務中,這樣時間記錄就與服務器端的數據加載分開了。

  1. // Post repeat directive for logging the rendering time   
  2. angular.module('siApp.services').directive('postRepeatDirective',   
  3.   ['$timeout''$log',  'TimeTracker',   
  4.   function($timeout, $log, TimeTracker) {   
  5.     return function(scope, element, attrs) {   
  6.       if (scope.$last){   
  7.          $timeout(function(){   
  8.              var timeFinishedLoadingList = TimeTracker.reviewListLoaded();   
  9.              var ref = new Date(timeFinishedLoadingList);   
  10.              var end = new Date();   
  11.              $log.debug("## DOM rendering list took: " + (end - ref) + " ms");   
  12.          });   
  13.        }   
  14.     };   
  15.   }   
  16. ]);   
  17.     
  18. // Use in HTML:   
  19. <tr ng-repeat="item in items" post-repeat-directive>…</tr>   

Chrome開發者工具的時間軸(Timeline)屬性

在Chrome開發者工具的時間軸標簽中,你可以看見事件、每秒內瀏覽器幀數和內存分配。“memory”工具用來檢測內存泄漏,及頁面所需的內 存。當幀速率每秒低于30幀時就會出現頁面閃爍問題。“frames”工具可幫助了解渲染性能,還可顯示出一個JavaScript任務所花費的CPU時 間。

三、通過限制列表的大小進行基本的調優

緩解該問題,最好的辦法是限制所顯示列表的大小。可通過分頁、添加無限滾動條來實現。

分頁

分頁,我們可以使用AngularJS的“limitTo”過濾器(AngularJS1.1.4版本以后)和“startFrom”過濾器。可以通過限制顯示列表的大小來減少渲染時間。這是減少渲染時間最高效的方法。

  1. // Pagination in controller   
  2. $scope.currentPage = 0;   
  3. $scope.pageSize = 75;   
  4. $scope.numberOfPages = function() {   
  5.     return Math.ceil($scope.displayedItemsList.length/ $scope.pageSize);   
  6. };   
  7.     
  8. // Start from filter   
  9. angular.module('app').filter('startFrom'function() {   
  10.     return function(input, start) {           
  11.         return input.slice(start);   
  12. };   
  13.     
  14. // Use in HTML   
  15. // Pagination buttons   
  16. <button ng-repeat="i in getNumber(numberOfPages()) track by $index" ng-click="setCurrentPage($index)">{{$index + 1}}</button   
  17.     
  18. // Displayed list   
  19. <tr ng-repeat="item in displayedItemsList | startFrom: currentPage * pageSize  | limitTo:pageSize" /tr>   

如果你不能/不想使用分頁,但過濾過程又很慢,這時一定要檢查前五步,并使用“ng-show”隱藏掉多余的列表元素。

無限滾動條

如果你希望進一步了解該方法,可訪問 http://binarymuse.github.io/ngInfiniteScroll/

四、七大調優法則

1. 渲染沒有數據綁定的列表

這是最明顯的解決方案,因為數據綁定是性能問題最可能的根源。如果你只想顯示一次列表,并不需要更新、改變數據,放棄數據綁定是絕佳的辦法。不過可惜的是,你會失去對數據的控制權,但除了該法,我們別無選擇。進一步了解: https://github.com/Pasvaz/bindonce。

2.不要使用內聯方法計算數據

為了在控制器中直接過濾列表,不要使用可獲得過濾鏈接的方法。“ng-repeat”會評估每個 [$digest(http://docs.angularjs.org/api/ng.$rootScope.Scope#$digest)%5D表達式。在我們的案例中,“filteredItems()”返回過濾鏈接。如果評估過程很慢,它將迅速降低整個應用的速度。

  1. <li ng-repeat="item in filteredItems()">//這并不是一個好方法,因為要頻繁地評估。   
  2. <li ng-repeat="item in items">//這是要采用的方法   

3.使用兩個列表(一個用來進行視圖顯示,一個作為數據源)

將要顯示的列表與總的數據列表分開,是非常有用的模型。你可以對一些過濾進行預處理,并將存于緩存中的鏈接應用到視圖上。下面案例展示了基本實現過程。filteredLists變量保存著緩存中的鏈接,applyFilter方法來處理映射。

  1. /* Controller */   
  2. // Basic list   
  3. var items = [{name:"John", active:true }, {name:"Adam"}, {name:"Chris"}, {name:"Heather"}];   
  4.     
  5. // Init displayedList   
  6. $scope.displayedItems = items;   
  7.     
  8. // Filter Cache   
  9. var filteredLists['active'] = $filter('filter)(items, {"active" : true});   
  10.     
  11. // Apply the filter   
  12. $scope.applyFilter = function(type) {   
  13.     if (filteredLists.hasOwnProperty(type){ // Check if filter is cached   
  14.         $scope.displayedItems = filteredLists[type];   
  15.     } else {   
  16.         /* Non cached filtering */   
  17.     }   
  18. }   
  19.     
  20. // Reset filter   
  21. $scope.resetFilter = function() {   
  22.     $scope.displayedItems = items;   
  23. }   
  24.     
  25. /* View */   
  26. <button ng-click="applyFilter('active')">Select active</button>   
  27. <ul><li ng-repeat="item in displayedItems">{{item.name}}<li></ul>   

#p#

4.在其他模板中使用ng-if來代替ng-show

如果你用指令、模板來渲染額外的信息,例如通過點擊來顯示列表項的詳細信息,一定要使用  ng-if(AngularJSv. 1.1.5以后)。ng-if可阻止渲染(與ng-show相比)。所以其它DOM和數據綁定可根據需要進行評估。

  1. <li ng-repeat="item in items">   
  2.     <p> {{ item.title }} </p>   
  3.     <button ng-click="item.showDetails = !item.showDetails">Show details</buttons>   
  4.     <div ng-if="item.showDetails">   
  5.         {{item.details}}   
  6.     </div>   
  7. </li>   

5.不要使用ng-mouseenter、ng-mouseleave等指令

使用內部指令,像ng-mouseenter,AngularJS會使你的頁面閃爍。瀏覽器的幀速率通常低于每秒30幀。使用jQuery創建動畫、鼠標懸浮效果可以解決該問題。確保將鼠標事件放入jQuery的.live()函數中。

6.關于過濾的小提示:通過ng-show隱藏多余的元素

對于長列表,使用過濾同樣會減低工作效率,因為每個過濾都會創建一個原始列表的子鏈接。在很多情況下,數據沒有變化,過濾結果也會保持不變。所以對數據列表進行預過濾,并根據情況將它應用到視圖中,會大大節約處理時間。

在ng-repeat指令中使用過濾器,每個過濾器會返回一個原始鏈接的子集。AngularJS 從DOM中移除多余元素(通過調用 $destroy),同時也會從$scope中移除他們。當過濾器的輸入發生改變時,子集也會隨著變化,元素必須進行重新鏈接,或著再調 用$destroy。

大部分情況下,這樣做很好,但一旦用戶經常過濾,或者列表非常巨大,不斷的鏈接與銷毀將影響性能。為了加快過濾的速度,你可以使用ng-show 和ng-hide指令。在控制器中,進行過濾,并為每項添加一個屬性。依靠該屬性來觸發ng-show。結果是,只為這些元素增加ng-hide類,來代 替將它們移除子列表、$scope和DOM。

觸發ng-show的方法之一是使用表達式語法。ng-show的值由表達式語法來確定。可以看下面的例子:

  1. <input ng-model="query"></input>   
  2. <li ng-repeat="item in items" ng-show="([item.name] | filter:query).length">{{item.name}}
  3. </li><span style="font-size: 14px; line-height: 24px; font-family: Helvetica, Tahoma, Arial, sans-serif; white-space: normal;"></span>   

另一個方法是為ng-show傳遞一個屬性,并在單獨的子控制器進行計算。該方法稍有點復雜,但卻是更明晰的方法。

7.關于過濾的小提示:防抖動輸入

解決第6點提出的持續過濾問題的另一個方法是防抖動用戶輸入。例如,如果用戶輸入一個搜索關鍵詞,只當用戶停止輸入后,過濾器才會被激活。使用該防抖動服務的一個很好的解決方案請見:http://jsfiddle.net/Warspawn/6K7Kd/。將它應用到你的視圖及控制器中,如下所示。

  1. /* Controller */   
  2. // Watch the queryInput and debounce the filtering by 350 ms.   
  3. $scope.$watch('queryInput'function(newValue, oldValue) {   
  4.     if (newValue === oldValue) { return; }   
  5.     $debounce(applyQuery, 350);   
  6. });   
  7. var applyQuery = function() {   
  8.     $scope.filter.query = $scope.query;   
  9. };   
  10.     
  11. /* View */   
  12. <input ng-model="queryInput"/>   
  13. <li ng-repeat= item in items | filter:filter.query>{{ item.title }} </li>   

原文鏈接:http://tech.small-improvements.com/2013/09/10/angularjs-performance-with-large-lists/

譯文鏈接:http://www.iteye.com/news/28313

責任編輯:陳四芳 來源: iteye.com
相關推薦

2010-05-05 14:04:31

Oracle 性能

2011-03-10 14:40:54

LAMPMysql

2023-02-07 08:00:00

MySQL數據庫技巧

2017-07-21 08:55:13

TomcatJVM容器

2011-04-07 16:15:31

MySQL服務器調優

2012-06-20 11:05:47

性能調優攻略

2017-11-17 08:56:59

Java性能優化技巧

2021-03-04 08:39:21

SparkRDD調優

2014-04-24 10:11:17

iOS性能調優

2020-10-20 11:13:19

性能調優標準

2012-03-26 10:55:03

JavaJava EE

2011-11-14 10:28:23

2020-11-30 11:40:35

NginxLinux性能調優

2011-05-20 15:02:01

Oracle性能調優

2015-11-10 09:25:05

HTTP2提升性能

2010-08-18 09:32:45

DB2優化性能

2014-12-01 11:30:06

PostgreSQL

2011-03-18 11:21:48

2024-11-11 08:11:39

2016-03-25 09:59:38

性能調優LinuxMySQL
點贊
收藏

51CTO技術棧公眾號

欧美日韩黄色| 久久不射影院| 韩国视频一区二区| 欧美贵妇videos办公室| 狠狠人妻久久久久久综合蜜桃| sm久久捆绑调教精品一区| 久久久精品国产免大香伊| 国产又爽又黄的激情精品视频| 蜜臀av午夜精品久久| 亚洲精品一区二区三区中文字幕| 欧美日韩国产精品专区 | 天堂视频中文在线| 久久99精品一区二区三区| 色综合天天狠天天透天天伊人| 亚洲第一成人网站| 日韩在线精品强乱中文字幕| 一本色道久久综合精品竹菊| 男女激烈动态图| 四虎影院在线播放| 国产成人综合视频| 国产精品欧美久久久| 欧美一级高潮片| 999久久久国产精品| 亚洲国产成人久久| 波多野结衣网页| 嫩草伊人久久精品少妇av杨幂| 亚洲动漫第一页| 91制片厂免费观看| yiren22亚洲综合伊人22| www.av精品| 99在线视频播放| 97人妻精品一区二区三区动漫| 五月香视频在线观看| 国产剧情av麻豆香蕉精品| 98精品国产自产在线观看| 久久一级免费视频| 欧美激情在线有限公司| 亚洲福利精品视频| 精品人人视频| 一区二区三区美女| 亚洲成人动漫在线| 国产九色在线| 久久久久久久久免费| 亚洲精品免费网站| 91久久精品国产91性色69| 久久精品欧洲| 欧美综合在线观看| 欧美三日本三级少妇99| 海角社区69精品视频| 久久精品视频播放| av在线免费播放网址| 欧美日韩黑人| 国产亚洲一区二区在线| 91精品人妻一区二区| 欧美成人午夜77777| 精品蜜桃在线看| 香蕉视频1024| 久久99精品久久久久久欧洲站| 精品国偷自产国产一区| 岛国av免费观看| 国产图片一区| 精品国产三级a在线观看| 古装做爰无遮挡三级聊斋艳谭| 亚洲日韩中文字幕一区| 6080午夜不卡| 午夜激情视频网| 日韩三级久久| 亚洲精品在线观| 午夜剧场免费看| 日韩中出av| 亚洲人成伊人成综合网久久久| 丰满少妇高潮一区二区| 欧美在线色图| 久久久www成人免费精品| 国产又粗又硬又长又爽| 日韩欧美字幕| 久久国产精品首页| 久久免费播放视频| 在线亚洲自拍| 国产精品久久久久久久电影| 91av久久久| 成人综合婷婷国产精品久久蜜臀 | 亚洲欧美综合v| 久久久久久国产免费a片| 久久一本综合| 欧美激情精品久久久| 中文字幕第15页| 免费国产亚洲视频| 亚洲www永久成人夜色| 亚洲精品喷潮一区二区三区| 白白色 亚洲乱淫| 日韩影视精品| 午夜小视频福利在线观看| 黄色一区二区在线| 中文字幕在线综合| 成人在线视频中文字幕| 亚洲少妇激情视频| 国产盗摄x88av| 久久人人超碰| 999日本视频| 精品亚洲综合| 一区二区三区欧美亚洲| 无码人妻丰满熟妇区五十路百度| 未满十八勿进黄网站一区不卡| 精品国产乱码久久久久久蜜臀| 久久成人激情视频| 黄色亚洲在线| 国产精品视频一区国模私拍 | 欧美国产视频一区| 婷婷午夜社区一区| 欧美mv日韩mv| 激情五月激情综合| 久久久久国产精品一区二区| 亚洲自拍高清视频网站| 国产乱子伦三级在线播放| 亚洲午夜激情网站| 中文字幕资源在线观看| 蜜桃精品wwwmitaows| 欧美精品国产精品日韩精品| 中文字幕 欧美激情| 成人网男人的天堂| 色呦呦网站入口| 三妻四妾的电影电视剧在线观看| 91精品国产色综合久久不卡电影 | 成人免费激情视频| 九色国产在线观看| 欧美日韩国产一区中文午夜| 久久久久国产精品免费网站| 日本网站在线看| 综合伊思人在钱三区| 欧美高清在线观看| 国产精品女同一区二区| 国产精品午夜在线观看| 国产精品免费入口| 日本少妇精品亚洲第一区| 中文字幕日韩精品有码视频| 亚洲综合久久网| gogo大胆日本视频一区| 日本一级黄视频| 蜜桃在线一区| 久久久91精品| 一本到在线视频| 国产精品欧美一区喷水| 8x8x最新地址| 国产影视精品一区二区三区| 欧美资源在线观看| 欧美日韩伦理片| 欧美日韩免费在线| 韩国无码一区二区三区精品| 亚洲二区视频| 国产在线精品日韩| 国产福利电影在线播放| 亚洲国产精品va在看黑人| 精品午夜福利视频| 成人av资源在线观看| 免费看毛片的网址| 老牛精品亚洲成av人片| 97福利一区二区| 日本一区视频| 在线观看视频一区二区| 中文字幕伦理片| 久久国产婷婷国产香蕉| 中文字幕日韩精品久久| 中文字幕日韩亚洲| 欧美成人一二三| 六月婷婷综合网| 欧美日韩亚洲91| 这里只有久久精品| 日韩精品福利网| 一区二区冒白浆视频| 韩国一区二区三区视频| 久久99精品久久久久久琪琪| 国模私拍视频在线| 黑人欧美xxxx| a一级免费视频| 粉嫩久久99精品久久久久久夜| 国产真人做爰毛片视频直播| 偷窥自拍亚洲色图精选| 国产精品久久久久久av| 制服丝袜在线播放| 亚洲精品黄网在线观看| 伊人久久中文字幕| 亚洲欧美日韩中文播放| 男人网站在线观看| 麻豆精品网站| 中文字幕中文字幕99| 一区二区三区国产好| 4p变态网欧美系列| 91视频在线观看| 精品成人a区在线观看| 成人一级免费视频| 亚洲精品中文字幕乱码三区| 成人影视免费观看| 激情综合五月天| 欧美视频在线播放一区| 日韩欧美一区免费| 久久99精品久久久久久三级| 四虎视频在线精品免费网址| 91成人国产在线观看| 在线看的av网站| 精品剧情v国产在线观看在线| 无码一区二区三区| 一区二区三区日韩欧美精品| 神马久久久久久久久久久| 国产98色在线|日韩| mm1313亚洲国产精品无码试看| 久久久久亚洲| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 宅男在线观看免费高清网站| 亚洲毛片在线看| 成人av无码一区二区三区| 在线观看亚洲a| 国产精品999在线观看| 一区二区三区中文字幕电影| 纪美影视在线观看电视版使用方法| 成人综合激情网| 中文字幕永久有效| 久久久xxx| 9久久9毛片又大又硬又粗| 亚洲精品网址| 亚洲视频小说| 精品一区在线| 久久精品日韩| 免费看久久久| 国产欧美日韩综合一区在线观看 | 国产精品国模大尺度私拍| 成人免费在线观看视频| 日本免费一区二区三区视频观看| 女囚岛在线观看| 久久影院中文字幕| 免费高清完整在线观看| 在线播放日韩精品| 高清av在线| 一区二区三区四区视频| 青青操视频在线| 日韩高清免费在线| 天堂在线视频免费观看| 精品88久久久久88久久久| 亚洲大尺度视频| 精品三级在线观看| 亚洲精品一区二区三区区别| 日韩精品中午字幕| 亚洲国产成人精品一区二区三区| 日韩一区二区三区高清免费看看| 国产精品午夜福利| 在线播放/欧美激情| 国产喷水吹潮视频www| 欧美日产国产精品| 国产一区二区三区在线观看| 欧美精品一级二级| 国产精品综合在线| 日韩一区二区在线看| 99精品免费观看| 欧美第一区第二区| 色综合久久久久久| 日韩av最新在线| 九色在线视频| 日韩中文综合网| 成人国产免费电影| 欧美大片免费看| 中文一区一区三区高中清不卡免费| 98精品在线视频| 456亚洲精品成人影院| 国产乱肥老妇国产一区二| 欧美高清免费| 动漫3d精品一区二区三区 | 精品国产一区久久| 日本免费网站在线观看| 亚洲精品中文字| 欧洲不卡av| 久久免费在线观看| 老司机2019福利精品视频导航| 国产精品99久久久久久久久久久久 | 青青青免费视频在线2| 亚洲欧美日韩精品久久奇米色影视| 成人在线视频成人| 久久综合电影一区| 国产不卡人人| 国产精品永久免费在线| 一区二区三区在线免费看| 精品乱子伦一区二区三区| 国产精品一国产精品| eeuss中文| 亚洲国产午夜| 免费黄色一级网站| 国产成人亚洲综合a∨婷婷| a级在线观看视频| 亚洲色图制服诱惑| 久久亚洲天堂网| 91精品国产综合久久精品| 午夜国产在线观看| 日韩午夜在线视频| 色资源二区在线视频| 国产日韩欧美日韩| 美日韩黄色大片| 在线视频欧美一区| 国产精品美女| 九九九九九九九九| 91老司机福利 在线| 天天干中文字幕| 欧美色综合影院| 亚洲欧美日韩免费| 欧美成人免费全部观看天天性色| 老司机2019福利精品视频导航| 97久久夜色精品国产九色| 国产一区二区三区站长工具| 九九爱精品视频| 国产原创一区二区| 中文字幕网站在线观看| 亚洲国产视频一区二区| 一区二区三区精| 亚洲男人的天堂网站| h片在线观看| 亚洲aaa激情| 四季av一区二区凹凸精品| 日韩精品一区二区三区久久| 国产成a人无v码亚洲福利| 国产一区在线观看免费| 91久久精品午夜一区二区| 深爱激情五月婷婷| 久久69精品久久久久久久电影好| 91伊人久久| 欧美大香线蕉线伊人久久| 激情成人亚洲| 欧美人与性动交α欧美精品| 国产精品久久看| 国产主播第一页| 日韩精品在线观看视频| av电影在线免费| av电影成人| 中文字幕日韩一区二区不卡| 欧美wwwwwww| 中文字幕国产一区| 无码人妻精品一区二区三区蜜桃91 | 亚洲欧美日韩动漫| 97精品免费视频| 精品午夜电影| 国产精品www在线观看| 国产成人精品亚洲日本在线桃色 | 国产原创欧美精品| 成人三级视频| 中文字幕在线综合| 国产精品久久久久影视| 一级黄色片在线观看| 色999日韩欧美国产| 农村妇女一区二区| 一本久道久久综合| 久久精品av麻豆的观看方式| 亚洲色图100p| 欧美久久久一区| a视频在线观看| 成人xxxxx色| 日韩亚洲在线| 蜜臀av一区二区三区有限公司| 精品日本美女福利在线观看| 天堂av在线7| 国产精品第七影院| 久久在线播放| 色欲无码人妻久久精品| 一级特黄大欧美久久久| 日本高清视频网站| 欧美一级高清免费| 国产一区二区欧美| 激情黄色小视频| 一区二区在线观看不卡| 人人妻人人澡人人爽久久av | 中文字幕久久亚洲| 亚洲免费看片| 国产一区二区片| 99精品国产99久久久久久白柏| 亚洲天堂视频网站| 中文字幕欧美日韩精品| 国产精品日韩精品在线播放| 久久精品无码中文字幕| 91丨porny丨户外露出| 日韩黄色片网站| 欧美成人午夜剧场免费观看| 美女一区二区在线观看| 国产又大又黄又粗的视频| 亚洲欧美一区二区三区孕妇| 欧洲精品久久一区二区| 日本成人精品在线| 国产精品久久久久一区二区三区厕所| 一级网站在线观看| 精品久久久久久久久久久久久久| 国产高清视频在线播放| 97人人模人人爽视频一区二区| 亚洲中午字幕| 手机在线免费看片| 亚洲精品福利免费在线观看| 国产69精品久久久久9999人| 日韩精品在线观看av| 国产欧美一区二区三区网站| 国产sm主人调教女m视频| 欧美中文在线视频| 亚洲精品一区二区妖精| 素人fc2av清纯18岁| 91精品国产aⅴ一区二区| 中文字幕影音在线| 中文字幕乱码免费|