我试图找到最好的方法来做到这一点,因为会有很多数据,而且我不想让巨大的循环占用资源。我有很多常规的javascript / jquery经验,但我是Angular的新手,并希望使用Angularjs最佳实践。
我有一个items
列表,用户可以"收藏"他们。在查看所有items
时,我想通过用指标标记它们来显示所支持的items
。 favorites
和$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;
}
}
};
都位于不同的表中,并以具有不同ID的JSON格式返回。
JS:
<div ng-repeat="item in items">
<i ng-class="isFavorite(item.id) ? 'icon-bookmark' : 'icon-bookmark-empty'"></i>
</div>
HTML:
isFavorite
我还有其他一些检查&#34; {{1}}&#34;所以我试图找出比较2的最好方法,而不是每次都在循环中检查。有什么建议吗?
答案 0 :(得分: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实现的完整代码