ここでの本当の問題は、新しい変数を作成してフィルターから出力するのではなく、入力を変更していることのようです。これにより、入力した変数を監視しているすべてのものに対して監視がトリガーされます。
独自のフィルターを完全に制御する必要があるため、そこに「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>
...そこにはタイプミスがあると思いますが、それが基本的な考え方です。
もう一度編集:あなたはすでにこの答えを受け入れていることを知っていますが、これを行うためのもう1つの方法があります。私は最近、あなたがもっと良いと思うかもしれないことを学びました。
<div ng-repeat="item in groupedItems = (items | group:3 | filter1 | filter2)">
<div ng-repeat="subitem in items.subitems">
{{subitem}}
</div>
</div>
これにより、$scopeに$scope.groupedItemsという新しいプロパティがオンザフライで作成され、フィルタリングおよびグループ化された結果が効果的にキャッシュされます。
それを回転させて、それがあなたのためにうまくいくかどうか私に知らせてください。そうでなければ、私は他の答えがより良いかもしれないと思います。