过滤后更新AngularJS中的分页
Update pagination in AngularJS after filtering
我已经实现了分页。现在,我希望在过滤结果后更新分页。
形式:
<input type="text" data-ng-model="search.name" data-ng-change="filter()"/>
列表:
<li data-ng-repeat="data in filtered = (list | filter:search) | filter:search | startFrom:(currentPage-1)*entryLimit | limitTo:entryLimit">{{data.name}}</li>
分页:
<pagination data-boundary-links="true" data-num-pages="noOfPages" data-current-page="currentPage" max-size="maxSize"></pagination>
控制器:
$scope.filter = function() {
window.setTimeout(function() { //wait for 'filtered' to be changed
$scope.noOfPages = Math.ceil($scope.filtered.length/$scope.entryLimit);
$scope.setPage = function(pageNo) {
$scope.currentPage = pageNo;
};
}, 10);
};
我的问题是,在点击页码或在输入字段中输入下一个字符后,分页刚刚更新。所以它更新得晚了一步。
编辑:我将源代码添加到jsFiddle中:http://jsfiddle.net/eqCWL/2/
@abject_error使用$timeout
的回答确实有效。我用他的建议编辑了你的小提琴,并制作了这个jsFiddle
CAVEAT
我认为这个解决方案以种族状况的形式表明了一个更大的问题!
jsFiddle使用filterFilter和$watch
而这把小提琴正是现实生活中的一种方式。
这是解释
您的竞赛条件介于处理search
的更改和$scope.filtered
的可用性之间。
我认为为了解决这种种族状况,需要消除的罪魁祸首是:
ng-model="search" ng-change="filter()"
和
ng-repeat="data in filtered = (list | filter:search)......."
使用ng-change
触发"filter(("来计算noOfPages
,但也取决于搜索的变化来创建filtered
。这样做可以确保过滤后的列表不可能及时准备好计算页数,这就是为什么在超时的情况下将"filter(("延迟10ms会给你一种工作程序的错觉。
您需要的是一种方法来"观察"search
的更改,然后在您可以创建$scope.filtered
和计算$scope.noOfPages
的地方过滤列表。按顺序排列,不分种族。
Angular就是这样!可以将控制器中的filter
过滤器用作名称非常糟糕的函数:filterFilter
。请参阅过滤器指南-在控制器和服务中使用过滤器
将其注入控制器。
function pageCtrl($scope, filterFilter) {
// ...
}
在$watch
函数中使用它,记录在范围文档中
$scope.$watch('search', function(term) {
// Create filtered
$scope.filtered = filterFilter($scope.list, term);
// Then calculate noOfPages
$scope.noOfPages = Math.ceil($scope.filtered.length/$scope.entryLimit);
})
更改模板以反映我们的新方式。不再使用DOM过滤器或ng-change
<input type="text" ng-model="search" placeholder="Search"/>
和
<li ng-repeat="data in filtered | startFrom:(currentPage-1)*entryLimit | limitTo:entryLimit">
{{data.name}}
</li>
您可以简单地使用以下指令:
https://github.com/michaelbromley/angularUtils/tree/master/src/directives/pagination
它提供了带有过滤器的分页,同时保持代码的整洁。
为伟大的代码向michaelbromley致敬。
使用$timeout
而不是window.setTimeOut
。CCD_ 16被适当地包装以在Angular中一致地工作。
使用角度$scope.$watch
$scope.$watch('search', function(term) {
$scope.filter = function() {
$scope.noOfPages = Math.ceil($scope.filtered.length/$scope.entryLimit);
}
});
来源;http://jsfiddle.net/eqCWL/2/
Demo;http://jsfiddle.net/eqCWL/192/
- 用于分页的 AngularJS 自定义过滤器
- 如何使用 angularjs 使用 ngrepeat 和 bootstrap ui 创建分页
- AngularJS - 分页不渲染$scope.手表更换(包括代码笔)
- Angularjs:目录分页控件没有'即使按下页面按钮,也不会显示下一页
- Angularjs在使用分页时无法显示orderBy
- angularjs html中动态表的分页
- 为AngularJS博客分页
- 当uib分页被包装在另一个指令中时,AngularJS表数据没有更新
- AngularJS:从Firebase获取用于分页的记录
- 通过将$resource查询数组添加到AngularJS中另一个数组的底部来进行分页加载
- AngularJS分页-获取当前页面并传递给控制器
- AngularJS 服务器端排序与分页 - 动态值
- 分页在 AngularJS 中不起作用
- 使用 AngularJS 和 Azure Mobile Web Services 与 ng-resource 进行分页
- 分页和过滤在 AngularJS 中不稳定
- AngularJS分页,UI上的页面数量有限
- 使用 AngularJS 实现服务器端分页
- 如何从分页指令angularjs隐藏直接页面链接
- angularjs不显示动态搜索结果的分页
- AngularJs分页中的搜索框过滤器