Performance Angularjs-优化ngrepeat的观察者,以便只观察集合的某些属性

Performance Angularjs-优化ngrepeat的观察者,以便只观察集合的某些属性,performance,angularjs,angularjs-ng-repeat,Performance,Angularjs,Angularjs Ng Repeat,在我的angularJS应用程序中,我有一个相当大的对象集合(数组)。我需要在不同的地方绑定到此集合(例如,显示属性:包含的对象的名称)-绑定非常重要,因为这些名称可能会更改 由于正常的ngRepeat将通过严格的相等比较来观察整个集合,因此我担心应用程序的速度(我们谈论的是具有数千个或更多属性的对象)-实际上我只需要观察集合中的一般变化(如长度、两个元素翻转时单个引用的更改以及某些特定属性,如所提到的.name属性) 我正在考虑使用以下方法(基本上是创建集合的自定义副本并手动绑定到原始集合)

在我的angularJS应用程序中,我有一个相当大的对象集合(数组)。我需要在不同的地方绑定到此集合(例如,显示属性:包含的对象的名称)-绑定非常重要,因为这些名称可能会更改

由于正常的ngRepeat将通过严格的相等比较来观察整个集合,因此我担心应用程序的速度(我们谈论的是具有数千个或更多属性的对象)-实际上我只需要观察集合中的一般变化(如长度、两个元素翻转时单个引用的更改以及某些特定属性,如所提到的.name属性)

我正在考虑使用以下方法(基本上是创建集合的自定义副本并手动绑定到原始集合)

我的问题: 所描述的方法是否比观察原始集合更好(根据等式-据我所知,ngRepeater是这样做的),或者是否有更好的方法(例如,在watch语句中定义某种类型的比较回调以仅检查某些属性中的更改…)


函数QuickTestController($scope){
//模拟来自服务的数据
var serviceCollection=[],计数器=0,
generateElement=函数(){
var元素={name:'name'+++计数器};
//var元素={name:'name'};
对于(var j=0;j<5;j++)元素['property'+j]=j;
返回元素;
};
对于(变量i=0;i<5;i++){
push(generateeelement());
}
//在视图控制器中,我们可以直接绑定到服务集合(服务集合应在内部使用watchCollection,并监视每个元素是否相等)
$scope.viewCollection=servicecolection;
//关注收藏的平等性
/*
$scope.$watch(“'u viewCollectionObserve',函数(newValue,oldValue){
log('watch:',newValue,oldValue);
},对);
*/
//或者我们可以创建自己的watchCollection/watch结构,只查看我们感兴趣的属性
$scope.\u viewCollectionObserve=servicecolection;
var viewCollectionManual=[],
rebuildViewCollection=函数(){
viewCollectionManual=[];
for(var i=0,length=servicecolection.length;i
  • {{element.name}{{{element}

    • {{element.name}{{{element}}
    昌名 易变体性质 去除 添加物 开关元件
    removeCollection(请参见注释)
    任何帮助/意见都将不胜感激-请注意,我试图制作一把小提琴来演示我的方法,但失败了:-(

    (我知道基准测试可能是测试我的方法的一个可能的解决方案,但我更想知道这里angularjs专业人士的意见)

    谢谢,
    matthias

    我想你要找的是,这是一个高性能的绑定指令,可以让你在AngularJS中绑定一次属性或表达式,正如它的名字所暗示的那样。

    你也可以尝试的一件事是一个“track by”表达式。如果你有一个属性对于集合中的每个对象都是唯一的,你可以将它传递给y我们的重复表达

    <div ng-repeat="item in items track by item.id"></div>
    
    
    

    我认为angularjs将只关注每个项目的属性。因此,这将提高性能,但我不知道有多大。

    感谢您的回复!不过我知道您提到的指令,尽管angularjs团队甚至似乎有意将此功能包括在内
    <div ng-repeat="item in items track by item.id"></div>