私は多くのオブジェクト(JSONフォーマット)を含むデータ配列を持っています。この配列の内容として、次のものが想定されます。
var data = [
{
"name": "Jim",
"age" : 25
},
{
"name": "Jerry",
"age": 27
}
];
今、私はこれらの詳細を表示します。
<div ng-repeat="person in data | filter: query">
</div
ここでは、照会は、ユーザーが表示されるデータを制限できる入力フィールドにモデル化されています。
さて、現在表示している人/人の現在の数を表示する別の場所、つまりShowing {{data.length}} Persons
があります。
私がやりたいことは、ユーザーが人物を検索し、表示されているデータがクエリに基づいてフィルタリングされると、Showing...persons
も現在表示されている人物の値を変更することです。しかし、それは起こっていません。フィルタリングされたデータではなく、常にデータ内の総人数が表示されます。フィルタリングされたデータの数を取得するにはどうすればよいですか。
Angular 1.3+ の場合(@Tomへの貸方)
エイリアス式(ドキュメント: Angular 1.3.0:ngRepeat を使用し、引数セクションまでスクロールします)。
<div ng-repeat="person in data | filter:query as filtered">
</div>
1.3より前のAngularの場合
結果を新しい変数(filtered
など)に割り当ててアクセスします。
<div ng-repeat="person in filtered = (data | filter: query)">
</div>
結果数を表示します。
Showing {{filtered.length}} Persons
のような例をいじる 。クレジットは Pawel Kozlowski に移動します
完全を期すために、前の答え(コントローラー内の目に見える人々の計算を実行する)に加えて、以下の例のようにHTMLテンプレートでその計算を実行することもできます。
あなたの人々のリストがdata
変数にあり、あなたがquery
モデルを使用して人々をフィルタリングすると仮定すると、以下のコードはあなたのために働くでしょう:
<p>Number of visible people: {{(data|filter:query).length}}</p>
<p>Total number of people: {{data.length}}</p>
{{data.length}}
- 総人数を表示します{{(data|filter:query).length}}
- フィルタをかけた人数の印刷注 あなたがフィルタリングされたデータを使いたいなら、この解決策はうまくいくことに注意してください 一度だけ - ただし、フィルタリングされたデータを複数回使用すると、アイテムを表示し、フィルタされたリストの長さを表示するには、AngularJS 1.3+ または@Wummsで提案されている解決策として エイリアス式 (後述)の使用をお勧めします。 1.3より前のAngularJSバージョンの場合。
Angular 1.3の新機能
AngularJSの作成者は、この問題に気付き、バージョン 1.3(beta 17) でフィルタを適用した後のリピータの中間結果を格納する "alias"式を追加しました。
<div ng-repeat="person in data | filter:query as results">
<!-- template ... -->
</div>
<p>Number of visible people: {{results.length}}</p>
別名式 を使用すると、複数のフィルタ実行の問題を回避できます。
それが役立つことを願っています。
あなたが持っているなら最も簡単な方法
<div ng-repeat="person in data | filter: query"></div>
フィルタリングされたデータ長
<div>{{ (data | filter: query).length }}</div>
ngRepeatはフィルタを適用するときに配列のコピーを作成するので、フィルタ処理された要素のみを参照するためにソース配列を使用することはできません。
あなたのケースでは、 $filter
serviceを使ってコントローラの中にフィルタを適用するほうが良いかもしれません:
function MainCtrl( $scope, filterFilter ) {
// ...
$scope.filteredData = myNormalData;
$scope.$watch( 'myInputModel', function ( val ) {
$scope.filteredData = filterFilter( myNormalData, val );
});
// ...
}
それから、代わりにビューでfilteredData
プロパティを使用します。ここに働くPlunkerがあります: http://plnkr.co/edit/7c1l24rPkuKPOS5o2qtx?p=preview
AngularJS 1.3以降、エイリアスを使用できます。
item in items | filter:x as results
そしてどこかに:
<span>Total {{results.length}} result(s).</span>
docs :から
また、フィルタが適用された後にリピータの中間結果を格納するオプションのエイリアス式を指定することもできます。通常、これはリピーター上でフィルターがアクティブであるが、フィルター処理された結果セットが空の場合に、特別なメッセージをレンダリングするために使用されます。
たとえば、次のようになります。結果としてfilter:xは、繰り返しアイテムのフラグメントを結果として格納しますが、アイテムがフィルタを通して処理された後に限られます。
フィルタをグループ化することで複数レベルの結果を保存できることにも注意してください。
all items: {{items.length}}
filtered items: {{filteredItems.length}}
limited and filtered items: {{limitedAndFilteredItems.length}}
<div ng-repeat="item in limitedAndFilteredItems = (filteredItems = (items | filter:search) | limitTo:25)">...</div>
これが デモフィドルです
これがうまくいった例です Plunkerを見てください
<body ng-controller="MainCtrl">
<input ng-model="search" type="text">
<br>
Showing {{data.length}} Persons; <br>
Filtered {{counted}}
<ul>
<li ng-repeat="person in data | filter:search">
{{person.name}}
</li>
</ul>
</body>
<script>
var app = angular.module('angularjs-starter', [])
app.controller('MainCtrl', function($scope, $filter) {
$scope.data = [
{
"name": "Jim", "age" : 21
}, {
"name": "Jerry", "age": 26
}, {
"name": "Alex", "age" : 25
}, {
"name": "Max", "age": 22
}
];
$scope.counted = $scope.data.length;
$scope.$watch("search", function(query){
$scope.counted = $filter("filter")($scope.data, query).length;
});
});
あなたは 2つの方法でそれをすることができます 。 In template およびin Controller 。テンプレートでは、フィルタを適用した配列を別の変数に設定してから、必要に応じて使用できます。これを行う方法は次のとおりです。
<ul>
<li data-ng-repeat="user in usersList = (users | gender:filterGender)" data-ng-bind="user.name"></li>
</ul>
....
<span>{{ usersList.length | number }}</span>
例が必要な場合は、 AngularJsのフィルタ付きカウントの例/デモ を参照してください。