【发布时间】:2015-08-29 01:06:27
【问题描述】:
毫无疑问。通过互联网搜索,您可以轻松找到有关 ng-repeat 和复选框如何工作的示例。所有这些示例仅包含几个复选框。但是,您是否尝试过创建数百个复选框,然后使用一些切换按钮来选中/取消选中所有复选框?该应用程序变得完全没有响应。在浏览器中还可以,但在设备(iPad4、iPad mini 等)上测试应用程序时,应用程序完全没有响应。
我在这里创建了一个 Plunker 示例:http://plnkr.co/edit/wfa3TIp3BYaPvzX8ehAf?p=preview
尝试使用至少 500 个条目来测试切换复选框,以便您可以看到延迟。 现在的问题是,有什么方法可以提高性能吗?检查时间线的记录,这是我获得 500 个条目的结果(:
19.131 ms Scripting
150.104 ms Rendering
55.543 ms Painting
138.402 ms Other
2.95 s Idle
如您所见,渲染占用了宝贵的时间,我们不能浪费这样的时间。
HTML:
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width" />
<title>Ionic Framework Example</title>
<link href="//code.ionicframework.com/nightly/css/ionic.css" rel="stylesheet"/>
<link href="index.css" rel="stylesheet"/>
<script src="//code.ionicframework.com/nightly/js/ionic.bundle.js"></script>
<script src="script.js"></script>
</head>
<body>
<ion-view view-title="main module">
<ion-content ng-controller="StartCtrl">
<div class="list">
<div class="item item-divider">
Options
</div>
<a class="item item-icon-left" href="#" ng-click="generateEntries()">
<i class="icon ion-plus-circled"></i>
Add more entries
</a>
<a class="item item-icon-left" href="#" ng-click="clearEntries()">
<i class="icon ion-trash-b"></i>
Clear entries
</a>
<div class="item item-icon-left" href="#">
<i class="icon ion-person-stalker"></i>
Entries in array
<span class="badge badge-assertive">{{entries.length}}</span>
</div>
<li class="item item-checkbox">
<label class="checkbox">
<input type="checkbox" ng-model="checkedAll" ng-click="toggleAll()">
</label>
Toggle all
</li>
<div class="item item-divider">
Entries
</div>
<li class="item item-checkbox" ng-repeat="entry in entries track by $index">
<label class="checkbox">
<input type="checkbox" ng-model="entry.checked" name="entry.id">
</label>
{{entry.id}} - {{entry.name}}
<span class="badge badge-light">{{$index}}</span>
</li>
</div>
</ion-content>
</ion-view>
</body>
</html>
JS:
// Code goes here
var app = angular.module('myApp', []);
app.controller('StartCtrl', function ($scope) {
// bind data from service
// this.someData = Start.someData;
$scope.entries = [];
$scope.generateEntries = function () {
var names = ['Mark', 'John', 'Maria', 'Lea', 'Marco'];
var obj = {};
for (var i = 0; i < 50; i++) {
obj = {'id': Math.floor(Math.random() * 10000), 'name': names[Math.floor(Math.random() * names.length)]};
$scope.entries.push(obj);
}
};
$scope.clearEntries = function () {
$scope.entries = [];
};
$scope.toggleAll = function () {
for (var i = 0; i < $scope.entries.length; i++) {
$scope.entries[i].checked = $scope.checkedAll;
}
};
});
感谢所有参与本次讨论的人。
【问题讨论】:
-
问题:为什么一个页面需要 500 个元素,而在小屏幕的移动设备上也是如此?
-
这是客户请求@jaycp。他们将在 iPad 上使用上面复制的部分代码(如果你问我,iPad 没有这么小的屏幕)
-
分页在这种情况下会有所帮助。几乎您使用的任何其他前端框架,即使是原生 JS 来渲染如此大量的元素也需要花费大量时间。
标签: angularjs checkbox angularjs-ng-repeat toggle ionic-framework