2016-01-29 110 views
0

我分页的角度表,并要显示的表格下方的所有页码触发功能。AngularJS:在过滤器更换

我打算创建页面数的数组,然后用NG-重复,以显示它们:

HTML

<tr ng-repeat-start="item in c.filteredList = (c.data | dynamicFilter:c.filter | orderBy:c.sortOrder.order:c.sortOrder.reverse)"> 

JS

this.checkPage = function(){ 
     this.pageNumArr = []; 

     for(i=0; i<this.filteredList.length/this.perPage; i++){ 
     this.pageNumArr.push(i); 
     } 
    } 

哪里this.perPage是每页项目数(由用户设定)。

我无法弄清楚是如何触发checkPage()每当更换过滤器。

回答

3

你最好的页码NG-重复结合,创建并返回页码的阵列功能。这将为该函数创建一个观察器并保持页码数组是最新的。

会有没有必要在你的控制器手动创建一个$手表。

this.pageNumbers= function(){ 
     var pageNumArr = []; 

     for(i=0; i<this.filteredList.length/this.perPage; i++){ 
     pageNumArr.push(i); 
     } 
     return pageNumArr 

    } 

<span ng-repeat="page in c.pageNumbers()">{{page}}</span> 
+0

感谢。这很好。任何关于$ watch正在创建的性能影响的想法? – ibhhvc

0

你可以看为filteredList并调用checkPage()有:

var self = this; 
$scope.$watch(
    function() { 
     return self.filteredList.length; 
    }, 
    function(newValue, oldValue) { 
     if (newValue !== oldValue) { 
     self.checkPage(); 
     } 
    } 
); 
1

我认为,一个过滤器内触发事件不应该被认为是最好的做法,很可能,你需要找到另一种方法。

顺便说一句,有很多方式:

  1. 如果您可以编辑过滤器,简单地说,通过$scope参考,并通过$scope.emit$scope.broadcast触发事件:<li ng-repeat="item in items | myFilter:[param1, param2, paramN]"></li>

  2. 角支持过滤器内的控制器,所以,可能这应该是一个更好的解决方案https://toddmotto.com/everything-about-custom-filters-in-angular-js/(看看过滤器4:控制器/ $范围过滤器);

  3. 注册一个观察者对你的模型,但是,这是不好的表演......

+0

我不认为我曾经见过$ emit在过滤器中被使用。这是如何完成的? – ibhhvc

+0

是的,这是自定义过滤器:'app.filter( 'PAGINATE',函数(){ \t回报功能(输入,perPage,页次){ \t \t变种STARTROW = perPage *(页次-1); \t \t var endRow = startRow + perPage \t \t return input。切片(startRow,endRow); \t} }) – ibhhvc

+0

我认为@Pascal Winter正确地揭示了您正在寻找的内容,最好的解决方案是通过过滤器将分页符绑定到当前页面列表。 顺便说一句,当你传递'pageNum'和'perPage'时,你甚至可以传递'$ scope'或者它的一个属性(一个函数?)。 – Hitmands