How to display length of filtered ng-repeat data
我有一个包含许多对象的数据数组(JSON格式)。可以将以下内容假定为此数组的内容:
1 2 3 4 5 6 7 8 9 10 | var data = [ { "name":"Jim", "age" : 25 }, { "name":"Jerry", "age": 27 } ]; |
现在,我将这些详细信息显示为:
1 | </div |
在这里,查询被建模为一个输入字段,用户可以在其中限制显示的数据。
现在,我有另一个显示当前显示人数/人的位置,即
我想做的是,当用户搜索一个人,并且根据查询过滤显示的数据时,
对于角1.3+(学分为@tom)
使用别名表达式(docs:angular 1.3.0:ngrepeat,向下滚动到arguments部分):
1 |
For Angular prior to 1.3
将结果赋给一个新变量(如
1 |
显示结果数:
1 | Showing {{filtered.length}} Persons |
摆弄一个类似的例子。学分归Pawel Kozlowski
为了完整性,除了前面的答案(对控制器中可见的人执行计算)之外,您还可以在HTML模板中执行该计算,如下面的示例所示。
假设您的人员列表在
1 2 3 4 5 6 | <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版本建议的解决方案。
角度1.3中的新功能
AngularJS的创建者也注意到了这个问题,在1.3版(beta 17)中,他们添加了"alias"表达式,在应用了过滤器之后,它将存储中继器的中间结果,例如
1 2 3 4 5 6 | <!-- template ... --> <p> Number of visible people: {{results.length}} </p> |
别名表达式将阻止多个筛选器执行问题。
我希望这会有所帮助。
ngrepeat在应用筛选器时创建数组的副本,因此不能使用源数组仅引用已筛选的元素。
在您的情况下,使用
1 2 3 4 5 6 7 8 9 10 11 | function MainCtrl( $scope, filterFilter ) { // ... $scope.filteredData = myNormalData; $scope.$watch( 'myInputModel', function ( val ) { $scope.filteredData = filterFilter( myNormalData, val ); }); // ... } |
然后在视图中使用
如果你有最简单的方法
1 |
过滤数据长度
1 | {{ (data | filter: query).length }} |
因为AngularJS 1.3可以使用别名:
1 | item in items | filter:x as results |
某处:
1 | <span>Total {{results.length}} result(s).</span> |
来自DOCS:
You can also provide an
optional alias expression which will then store the intermediate
results of the repeater after the filters have been applied. Typically
this is used to render a special message when a filter is active on
the repeater, but the filtered result set is empty.For example: item in items | filter:x as results will store the
fragment of the repeated items as results, but only after the items
have been processed through the filter.
还可以注意到,通过对过滤器分组,可以存储多个级别的结果。
1 2 3 4 | all items: {{items.length}} filtered items: {{filteredItems.length}} limited and filtered items: {{limitedAndFilteredItems.length}} ... |
这是演示小提琴
下面是普朗克的例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <body ng-controller="MainCtrl"> <input ng-model="search" type="text"> Showing {{data.length}} Persons; Filtered {{counted}} <ul> <li ng-repeat="person in data | filter:search"> {{person.name}} </li> </ul> </body> 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; }); }); |
你可以用两种方法来完成。在模板和控制器中。在模板中,您可以将筛选后的数组设置为另一个变量,然后根据需要使用它。以下是操作方法:
1 2 3 4 5 6 7 8 9 10 | <ul> <li data-ng-repeat="user in usersList = (users | gender:filterGender)" data-ng-bind="user.name"> </li> </ul> .... <span>{{ usersList.length | number }}</span> |
如果您需要示例,请参阅AngularJS过滤计数示例/演示