Sti*_*ter 34 javascript pagination angularjs
我已经实施了分页.现在我希望在过滤结果后更新分页.
表格:
<input type="text" data-ng-model="search.name" data-ng-change="filter()"/>
Run Code Online (Sandbox Code Playgroud)
列表:
<li data-ng-repeat="data in filtered = (list | filter:search) | filter:search | startFrom:(currentPage-1)*entryLimit | limitTo:entryLimit">{{data.name}}</li>
Run Code Online (Sandbox Code Playgroud)
分页:
<pagination data-boundary-links="true" data-num-pages="noOfPages" data-current-page="currentPage" max-size="maxSize"></pagination>
Run Code Online (Sandbox Code Playgroud)
控制器:
$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);
};
Run Code Online (Sandbox Code Playgroud)
我的问题是,在点击页码后或在输入字段中输入下一个字符后,刚刚更新了分页.所以这是更新一步到晚.
编辑:我将源添加到jsFiddle:http://jsfiddle.net/eqCWL/2/
nac*_*son 36
@abject_error的回答使用$timeout
确实有效.我用他的建议编辑了你的小提琴并制作了这个jsFiddle
警告
我认为解决方案表明了竞争条件形式的更大问题!
这个小提琴是实现真实的方式.
这是解释
你的竞争条件是在处理变化search
和可用性之间$scope.filtered
.
我认为为了解决这种竞争条件而消除的罪魁祸首是:
ng-model="search" ng-change="filter()"
Run Code Online (Sandbox Code Playgroud)
和
ng-repeat="data in filtered = (list | filter:search)......."
Run Code Online (Sandbox Code Playgroud)
用ng-change
火关"过滤器()"做的计算noOfPages
,但也依赖于搜索的改变,以创建filtered
.这样做可以确保过滤后的列表无法及时准备好计算页数,这就是为什么在超时时间内将"filter()"拖动10ms会让您产生工作程序的错觉.
您需要的是一种"观察" search
更改的方法,然后在您可以访问创建$scope.filtered
和计算的位置过滤列表$scope.noOfPages
.一切顺序,没有比赛.
Angular就是这样!可以filter
在控制器中使用过滤器作为功能很差的命名:filterFilter
.在过滤器指南 - 在控制器和服务中使用过滤器中查看此内容
将其注入控制器.
function pageCtrl($scope, filterFilter) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
$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);
})
Run Code Online (Sandbox Code Playgroud)
更改模板以反映我们的新方式.在DOM过滤器中没有更多,或ng-change
<input type="text" ng-model="search" placeholder="Search"/>
Run Code Online (Sandbox Code Playgroud)
和
<li ng-repeat="data in filtered | startFrom:(currentPage-1)*entryLimit | limitTo:entryLimit">
{{data.name}}
</li>
Run Code Online (Sandbox Code Playgroud)