【发布时间】:2019-04-09 10:55:02
【问题描述】:
在我的 Angular js 应用程序中,我有一个对象数组$scope.time,其中包含一个名称、当前时间和另一个以毫秒为单位的定义时间。
在前端,我使用ng-bind 计算这两个时间之间的差异并以 H:m:s 格式显示。请运行以下代码。
var app = angular.module('angularapp', []);
app.filter("msTotime", function() {
return function(timee,started,ended) {
var startDate = new Date(started);
var endDate = new Date(ended);
var milisecondsDiff = endDate - startDate;
var final = Math.floor(milisecondsDiff/(1000*60*60)).toLocaleString(undefined, {minimumIntegerDigits: 2}) + ":" + (Math.floor(milisecondsDiff/(1000*60))%60).toLocaleString(undefined, {minimumIntegerDigits: 2}) + ":" + (Math.floor(milisecondsDiff/1000)%60).toLocaleString(undefined, {minimumIntegerDigits: 2}) ;
var defaulttime = '00:00:00';
if(final == '-01:-01:-01'){
return defaulttime;
}
else {
return final;
}
}
});
app.controller('list', function($scope,$window) {
$scope.time = [{"game":"Halo","now":1554805270181,"time":1554794475267},
{"game":"CODuty","now":1554805270181,"time":1554802957031},
{"game":"WOF","now":1554805270181,"time":1554732154093},
{"game":"WarCraft","now":1554805270181,"time":1554803456875},
{"game":"POP","now":1554805270181,"time":1554803456275},
{"game":"RedBulls","now":1554805270181,"time":1554800620012},
{"game":"Eragon","now":1554805270181,"time":1554433320072}];
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.10/angular.min.js"></script>
<div ng-app="angularapp">
<div ng-controller="list" >
<div ng-repeat="timer in time">
<h5>{{timer.game}}</h5><hr>
Milliseconds to H:M:S for {{timer.game}} <p style="display:inline-block" ng-bind="realtime | msTotime:timer.time:timer.now"></p><br>
</div>
</div>
</div>
$scope.time 数组是动态的,因为我从 api 获取数据(为了演示的目的,我在这里对其进行了硬编码)。
当我在$scope.time 数组中有几个对象时,上面的代码可以顺利运行。但是当有数千个对象时,我的浏览器开始滞后,因为msTotime 过滤器不断计算毫秒之间的差异并将其转换为H:m:s 并将其绑定到前端。
现在的问题是,当有 1000 个对象时,我的浏览器会消耗 40% 的 CPU。我相信ng-repeat 不是问题,因为当我注释掉<p style="display:inline-block" ng-bind="realtime | msTotime:timer.time:timer.now"> 时,CPU 使用率只有 5%,对象超过 1000 个。
有没有什么办法可以优化这里的ng-bind指令或者以其他方式进行时间计算,这样msTotime过滤器所做的计算就不会消耗太多的CPU。
【问题讨论】:
-
你可以在重复循环中使用track by,这样只有当数据发生变化时,列表才会更新
标签: angularjs performance optimization ng-bind ng-filter