在我正在进行的角度应用程序中,我正在尝试将复合过滤与分页结合使用。将有一个包含x
条目的表,每行包含三列。我在每列上面都有一个输入,用户可以根据输入文本过滤列。过滤器复合以将结果缩小到最佳 - 但在我的用例中,仍然可能在一个页面上显示太多,因此我尝试使用分页。
表体看起来像这样:
<tbody>
<tr>
<td class="col-md-4">
<input type="text" ng-model="nameFilter" class="form-control" placeholder="Name">
</td>
<td class="col-md-4">
<input type="text" ng-model="ageFilter" class="form-control" placeholder="Age">
</td>
<td class="col-md-4">
<input type="text" ng-model="stateFilter" class="form-control" placeholder="State">
</td>
</tr>
<tr data-ng-repeat="person in people | filter:{'name': nameFilter} | filter:{'age':ageFilter} | filter:{'state':stateFilter} | limitTo: itemsPerPage">
<td class="col-md-4">{{person.name}}</td>
<td class="col-md-4">{{person.age}}</td>
<td class="col-md-4">{{person.state}}</td>
</tr>
</tbody>
我正在使用的棘手部分是使用已应用的过滤器进行分页。我在单个搜索字段上看到了类似this one where the author uses a $watch的示例,并且仍然可以管理分页。我也看到通过研究可以使用$watchCollection
,但我不确定如何实现它。
$scope.$watchCollection('[nameFilter, ageFilter, stateFilter]', function(newValues) {
//not sure what to do here.
console.debug(newValues);
$scope.filtered = '';; //really it should equal the now filtered by 3 filters group of people
$scope.noOfPages = Math.ceil($scope.filtered.length/$scope.itemsPerPage);
});
在这种情况下,手表是否是最佳选择?我有这个工作plunker作为我正在做的工作的一个例子,但仍然需要一些关于分页的指导。我遇到的一个问题是我不确定如何使分页专门适用于数据列表。我已经看过其他的例子并且模仿了但是我认为过滤可能会弄乱它(不确定)?任何帮助表示赞赏。
答案 0 :(得分:2)
您无需关注过滤器。您只需要将过滤器绑定到您的分页。这样,angular将处理所有内容,您无需在控制器中编写其他代码。我更新了你的plunker,你可以看到如何用角度绑定实现一切。
此外,您还拥有处理分页的limitTo
过滤器
<tr data-ng-repeat="person in people | filter:{'name': nameFilter} | filter:{'age':ageFilter} | filter:{'state':stateFilter} | limitTo: itemsPerPage: (currentPage - 1) * itemsPerPage">
<td class="col-md-4">{{person.name}}</td>
<td class="col-md-4">{{person.age}}</td>
<td class="col-md-4">{{person.state}}</td>
</tr>
<ul uib-pagination
total-items="(people | filter:{'name': nameFilter} | filter:{'age':ageFilter} | filter:{'state':stateFilter}).length"
items-per-page="itemsPerPage"
boundary-links="true" ng-model="currentPage"></ul>