gpt4 book ai didi

angularjs - Angular 分组过滤器

转载 作者:行者123 更新时间:2023-12-04 00:44:50 26 4
gpt4 key购买 nike

关注 angular.js conditional markup in ng-repeat ,我尝试编写一个进行分组的自定义过滤器。我遇到了有关对象标识和正在监视更改的模型的问题,但我认为我终于解决了它,因为控制台中不再出现错误。

结果我错了,因为现在当我尝试将它与其他过滤器(用于分页)结合时

<div ng-repeat="r in blueprints | orderBy:sortPty | startFrom:currentPage*pageSize | limitTo:pageSize | group:3">
<div ng-repeat="b in r">

我得到了可怕的“10 $digest() 迭代达到。中止!”再次出现错误信息。

这是我的组过滤器:
filter('group', function() {
return function(input, size) {
if (input.grouped === true) {
return input;
}
var result=[];
var temp = [];
for (var i = 0 ; i < input.length ; i++) {
temp.push(input[i]);
if (i % size === 2) {
result.push(temp);
temp = [];
}
}
if (temp.length > 0) {
result.push(temp);
}
angular.copy(result, input);
input.grouped = true;
return input;
};
}).

注意 angular.copy 的使用和 .grouped输入上的标记,但无济于事:(
我知道例如 "10 $digest() iterations reached. Aborting!" due to filter using angularjs但显然我没有得到它。

而且,我猜分组逻辑有点幼稚,但那是另一回事了。任何帮助将不胜感激,因为这让我发疯。

最佳答案

看起来这里真正的问题是你正在改变你的输入,而不是创建一个新变量并从你的过滤器中输出它。这将触发监视您输入的变量的任何内容。

真的没有理由在那里添加“grouped == true”检查,因为您应该完全控制自己的过滤器。但是,如果这对您的应用程序来说是必须的,那么您需要将“grouped == true”添加到过滤器的结果中,而不是输入中。

过滤器的工作方式是改变输入并返回不同的东西,然后下一个过滤器处理以前的过滤器结果......所以你的“过滤”检查几乎是无关紧要的item in items | filter1 | filter2 | filter3其中 filter1 过滤项目,filter2 过滤 filter1 的结果,filter3 过滤过滤器 2 的结果......如果这是有道理的。

这是我刚刚提出的一些东西。我不确定(还)它是否有效,但它给了你基本的想法。你会在一侧取一个数组,然后在另一侧吐出一个数组数组。

app.filter('group', function(){
return function(items, groupSize) {
var groups = [],
inner;
for(var i = 0; i < items.length; i++) {
if(i % groupSize === 0) {
inner = [];
groups.push(inner);
}
inner.push(items[i]);
}
return groups;
};
});

HTML
<ul ng-repeat="grouping in items | group:3">
<li ng-repeat="item in grouping">{{item}}</li>
</ul>

编辑

也许在您的代码中看到所有这些过滤器会更好,但看起来它会导致问题,因为它经常需要在 $digest 上重新评估。所以我建议你做这样的事情:
app.controller('MyCtrl', function($scope, $filter) {
$scope.blueprints = [ /* your data */ ];
$scope.currentPage = 0;
$scope.pageSize = 30;
$scope.groupSize = 3;
$scope.sortPty = 'stuff';

//load our filters
var orderBy = $filter('orderBy'),
startFrom = $filter('startFrom'),
limitTo = $filter('limitTo'),
group = $filter('group'); //from the filter above

//a method to apply the filters.
function updateBlueprintDisplay(blueprints) {
var result = orderBy(blueprints, $scope.sortPty);
result = startForm(result, $scope.currentPage * $scope.pageSize);
result = limitTo(result, $scope.pageSize);
result = group(result, 3);
$scope.blueprintDisplay = result;
}

//apply them to the initial value.
updateBlueprintDisplay();

//watch for changes.
$scope.$watch('blueprints', updateBlueprintDisplay);
});

然后在您的标记中:
<ul ng-repeat="grouping in blueprintDisplay">
<li ng-repeat="item in grouping">{{item}}</li>
</ul>

...我确定那里有错别字,但这是基本思想。

再次编辑:我知道您已经接受了这个答案,但是我最近了解到还有另一种方法可以做到这一点,您可能更喜欢:
<div ng-repeat="item in groupedItems = (items | group:3 | filter1 | filter2)">
<div ng-repeat="subitem in items.subitems">
{{subitem}}
</div>
</div>

这将在您的 $scope 上动态创建一个名为 $scope.groupedItems 的新属性,它应该有效地缓存您的过滤和分组结果。

试一试,让我知道它是否适合你。如果没有,我想另一个答案可能会更好。

关于angularjs - Angular 分组过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14462015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com