我正在评估是否将 AngularJS 用于 Web 项目,并且我担心我需要实现的功能的性能。我想知道是否有更好的方法来实现我在 AngularJS 中尝试的功能。
从本质上讲,在我看来,AngularJS 对事件做出反应的时间取决于页面中 DOM 元素的数量,即使 DOM 元素没有被主动更改等等。我猜这是因为$digest 函数正在遍历整个 DOM .. 至少从我的实验来看,似乎是这样。
这是游戏场景(这并不是我真正想要做的,但足够接近用于测试目的)。
当我将鼠标悬停在它上面时,我想让 angularJS 突出显示一个单词。但是,随着页面中单词数量的增加,将鼠标悬停在单词上与实际突出显示时之间会有更大的延迟。
显示这个的 jsfiddle:http: //jsfiddle.net/czerwin/5qFzg/4/
(信用:此代码基于 Peter Bacon Darwin 在 AngularJS 论坛上的帖子)。
这是HTML:
<div ng-app="myApp">
<div ng-controller="ControllerA">
<div >
<span ng-repeat="i in list" id="{{i}}" ng-mouseover='onMouseover(i)'>
{{i}},
</span>
<span ng-repeat="i in listB">
{{i}},
</span>
</div>
</div>
</div>
这是javascript:
angular.module('myApp', [])
.controller('ControllerA', function($scope) {
var i;
$scope.list = [];
for (i = 0; i < 500; i++) {
$scope.list.push(i);
}
$scope.listB = [];
for (i = 500; i < 10000; i++) {
$scope.listB.push(i);
}
$scope.highlightedItem = 0;
$scope.onMouseover = function(i) {
$scope.highlightedItem = i;
};
$scope.$watch('highlightedItem', function(n, o) {
$("#" + o).removeClass("highlight");
$("#" + n).addClass("highlight");
});
});
注意事项: - 是的,我正在使用 jquery 来进行 DOM 操作。我走这条路是因为这是一种注册观察者的方式。如果我纯粹在 angularJS 中执行此操作,我将不得不为每个跨度注册一个鼠标悬停处理程序,这似乎也会使页面变慢。- 我也在纯 jquery 中实现了这种方法,并且性能很好。我不相信是 jquery 调用让我在这里放慢了速度。- 我只在前 500 个单词中添加了 id 和 classes,以验证它实际上只是有更多的 DOM 元素似乎会减慢它们的速度(而不是可能受操作影响的 DOM 元素)。