的 ng- 让我们非常方便的遍历数组生成 Dom 元素,但是使用不当也会有性能问题 。
在项目中我们使用 ng- 加载完一个列表后,如果再次请求数据,然后过滤列表,代码可能会这么写:
{{user.name}}
的代码:
文章插图
app.controller('Test', function($scope) {var users = [];for (var i = 0; i < 100; i++) {users[i] = {id: i,name: "User: " + i};}$scope.users = users;$scope.request = function () {// 从服务器加载新数据var result = [];// 直接重新赋值给 users$scope.users = result;};});
查看 ng- 的源码可以发现,当 ng- 的数组被替换时, 它默认并不会重新利用已有的 Dom 元素,而是直接将其全部删除并重新生成新的数组 Dom 元素:
// 将上次生成的所有 dom 移除for (key in lastBlockMap) {if (lastBlockMap.hasOwnProperty(key)) {block = lastBlockMap[key];elementsToRemove = getBlockElements(block.clone);$animate.leave(elementsToRemove);forEach(elementsToRemove, function(element) { element[NG_REMOVED] = true; });block.scope.$destroy();}}
Dom 的频繁操作是非常不友好的,为什么 ng- 不能利用已有的 dom 元素去更新数据呢?因为你没有把数组元素的标识属性告诉它,那么两次替换的时候它就没办法追踪了,我们可以看到 ng- 往数组里每个元素加了一个 $$ 的属性:
【AngularJs ng-repeat 必须注意的性能问题】
文章插图
这个 key 是由内部的 () 方法生成,类似数据库自增,但是是使用字符串 。
现在我们明白了,因为每次替换数组都会导致 ng- 为每个元素生成一个新 key, 所以根本没办法重用已有的 Dom 元素,那么我们可以使用下边的语法来避免这个问题:
// 使用 track by 标识{{user.name}}
这样 ng- 就用将其缓存起来啦,当然可能你的数组元素没有一个标识属性,如果元素数量不多那么可以接受,不然还是建议你手动为其生成一个标识属性 。
- angularjs中使用ng-repeat的注意点
- angularjs执行ng-repeat判断完成状态,生成可复用性自定义指令
- ng-repeat,ng-if angular笔记使用小技巧
- 后周皇帝郭威脸可以不要*必须得撩
- 泰国男人必须出家吗
- 男女须知:关于阴毛,你必须知道的几个正经冷知识,别不好意思! 世界之最阴毛
- 程序员必须掌握这几种排序算法的最佳实践,包会! 含GIF图 世界十大算法
- 公认最美萝莉,日本小千代,俄罗斯碧曼诺娃,我国必须是她 世界十大最美萝莉排行
- 即使没有秦桧,岳飞在高宗手下也必须*
- 看完让人绝望的10大限制级电影,不推荐观看但你必须要知道 世界十大禁片排行榜