2014-05-23 52 views
1

由于会有大量数据,我不想拥有占用资源的巨大循环,因此我试图找到这样做的最佳方法。我有很多常规的javascript/jquery经验,但对Angular来说是新手,并且希望通过Angularjs最佳实践来实现。在Angularjs中比较两个数组之间的对象

我有一个列表items和用户可以“喜欢”他们。当查看所有items时,我想通过用指示标记来显示那些最喜欢的。 itemsfavorites都位于不同的表中,并以不同的ID作为JSON返回。

JS:

$scope.favorites = [];//$http.get of JSON file 
$scope.items = [];//$http.get of JSON file 

$scope.isFavorite = function(itemId) { 
    var len = $scope.favorites. !== 'undefined' ? $scope.favorites.length : 0; 
    for(var i = 0; i < len; i++) { 
     if($scope.favorites[i].id === itemId) { 
      return true; 
     } 
    } 
}; 

HTML:

<div ng-repeat="item in items"> 
    <i ng-class="isFavorite(item.id) ? 'icon-bookmark' : 'icon-bookmark-empty'"></i> 
</div> 

我有一对夫妇的其他检查 “isFavorite” 所以我试图找出在2比不检查每一次的最佳方法在一个循环中。有什么建议么?

回答

2

我能想到的最佳方式是在收藏夹http请求返回数据后修改$ scope.items数组,并在每个项目上设置“最喜欢的”布尔属性。

这样,您的isFavourite方法将不会在每个摘要循环中触发。例如:

var promises = [$http.get('/items'), $http.get('/favourites')]; 

$q.all(promises).then(function (resultsArray) { 

    $scope.items = resultsArray[0]; 
    var favourites = resultsArray[1]; 

    $scope.items.forEach(function (item) { 
     var matches = favourites.filter(function (f) { 
       return f.id === item.id; 
      }); 
     item.favourite = matches.length ? true : false; 
    }); 

}); 

这也是值得铭记,你可能要在$ q.all方法来包装这两个http请求,这样就可以触发一个回调,一旦这两个HTTP请求已经完成。

编辑:更新,以显示完整的代码与$ q.all实施

+0

如果两个阵列从服务器返回的REQ,你怎么能肯定的项目在这里居住? –

+0

正如我的回答中所述,您必须将服务器请求包装在$ q.all方法中。例如$ q.all([$ http.get('/ items'),$ http.get('/ favorites')])。then(function(resultsArray){console.log(resultsArray);}); – romiem

+0

够公平的,但这个实现不会工作...不要拖延你只是说... –