angular ng-repeat数据绑定函数性能
angular ng-repeat data binding function performance
我正在遍历大量数据。每个对象都有一个 属性 开始时间和持续时间,这对每个对象都是唯一的。
我需要计算数组中每个对象的开始时间和持续时间,并根据这些计算设置元素宽度。
<div ng-repeat = "event in events track by event.id">
<div style="width:{{calculateWidth(event.startTime, event.duration)}}%">
<div>more content</div>
</div>
<div>
和我的 js
$scope.calculateWidth = function(duration, starTime){
var secondsInDay = 86400;
var width = (duration / secondsInDay)*100;
return width;
}
出于示例目的,我简化了代码,并省略了更多计算。总的来说,这适用于少于 30 个对象,但随着数据的增长,性能会下降。
在 Angular 中有更好的方法吗?
我看到 2 个选项:
- 加载数据时预先计算样式值并通过 ng-style 进行设置
- 创建另一个 'item' 指令,该指令最初会计算和应用样式并在需要时设置观察器
我会选择第 2 个,涉及最少的表达式。
编辑:
像这样:
<div ng-repeat = "event in events track by event.id">
<div my-event="event">
<div>more content</div>
</div>
<div>
和指令本身:
module.directive('myEvent', function() {
return {
scope:{
event:"=myEvent"
},
link:link
}
function link (scope,element, attrs){
var event = scope.event;
element.style.width = calcWidth(event.startTime, event.duration)+'px';
}
function calcWidth(duration, starTime){
var secondsInDay = 86400;
var width = (duration / secondsInDay)*100;
return width;
}
});
我正在遍历大量数据。每个对象都有一个 属性 开始时间和持续时间,这对每个对象都是唯一的。
我需要计算数组中每个对象的开始时间和持续时间,并根据这些计算设置元素宽度。
<div ng-repeat = "event in events track by event.id">
<div style="width:{{calculateWidth(event.startTime, event.duration)}}%">
<div>more content</div>
</div>
<div>
和我的 js
$scope.calculateWidth = function(duration, starTime){
var secondsInDay = 86400;
var width = (duration / secondsInDay)*100;
return width;
}
出于示例目的,我简化了代码,并省略了更多计算。总的来说,这适用于少于 30 个对象,但随着数据的增长,性能会下降。
在 Angular 中有更好的方法吗?
我看到 2 个选项:
- 加载数据时预先计算样式值并通过 ng-style 进行设置
- 创建另一个 'item' 指令,该指令最初会计算和应用样式并在需要时设置观察器
我会选择第 2 个,涉及最少的表达式。
编辑: 像这样:
<div ng-repeat = "event in events track by event.id">
<div my-event="event">
<div>more content</div>
</div>
<div>
和指令本身:
module.directive('myEvent', function() {
return {
scope:{
event:"=myEvent"
},
link:link
}
function link (scope,element, attrs){
var event = scope.event;
element.style.width = calcWidth(event.startTime, event.duration)+'px';
}
function calcWidth(duration, starTime){
var secondsInDay = 86400;
var width = (duration / secondsInDay)*100;
return width;
}
});