Javascript AngularJS:过滤器更改的触发函数

Javascript AngularJS:过滤器更改的触发函数,javascript,angularjs,Javascript,Angularjs,我正在为一个有角度的表格分页,并希望显示表格下的所有页码 我计划创建一个页码数组,然后使用ng repeat显示所有页码: 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(){ th

我正在为一个有角度的表格分页,并希望显示表格下的所有页码

我计划创建一个页码数组,然后使用ng repeat显示所有页码:

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.checkPage=function(){
this.pageNumArr=[];

对于(i=0;i您可以查看
filteredList
并在那里调用
checkPage()

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

您可以查看
filteredList
并在那里调用
checkPage()

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

最好将页码ng repeat绑定到一个函数,该函数创建并返回页码数组。这将为函数创建一个监视程序,并使页码数组保持最新

无需在控制器中手动创建$watch

 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>
this.pageNumbers=function(){
var pageNumArr=[];

对于(i=0;i您最好将页码ng repeat绑定到一个创建并返回页码数组的函数。这将为函数创建一个监视程序,并使页码数组保持最新

无需在控制器中手动创建$watch

 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>
this.pageNumbers=function(){
var pageNumArr=[];

对于(i=0;i我认为在过滤器内触发事件不应该被视为最佳实践,可能需要找到另一种方法

顺便说一下,有很多方法:

  • 如果您可以编辑该筛选器,只需将
    $scope
    引用传递给它,并通过
    $scope.emit
    $scope.broadcast
  • Angular支持控制器内部的过滤器,因此,这可能是一个更好的解决方案(看看过滤器4:controller/$scope filter)

  • 在你的模型上注册一个观察者,但是,这对性能不好


  • 我认为在过滤器内触发事件不应该被视为最佳实践,也许,您需要找到另一种方法

    顺便说一下,有很多方法:

  • 如果您可以编辑该筛选器,只需将
    $scope
    引用传递给它,并通过
    $scope.emit
    $scope.broadcast
  • Angular支持控制器内部的过滤器,因此,这可能是一个更好的解决方案(看看过滤器4:controller/$scope filter)

  • 在你的模型上注册一个观察者,但是,这对性能不好


  • 谢谢。这很好。对创建$watch的性能影响有什么想法吗?谢谢。这很好。对创建$watch的性能影响有什么想法吗?我想我从来没有见过在过滤器中使用$emit。这是怎么做到的?是的,这是一个自定义过滤器:
    app.filter('paginate',function(){返回函数(input,perPage,pageNum){var startRow=perPage*(pageNum-1);var endRow=startRow+perPage返回input.slice(startRow,endRow);}
    我认为@Pascal Winter正确地展示了您正在寻找的内容,最好的解决方案是通过过滤器将分页器绑定到当前页面列表。顺便说一下,当您传递
    pageNum
    perPage
    时,您甚至可以传递
    $scope
    或它的一个属性(函数?)。我想我从未见过$emit在过滤器中使用。这是如何实现的?是的,这是一个自定义过滤器:
    app.filter('paginate',function(){return function(input,perPage,pageNum){var startRow=perPage*(pageNum-1);var endRow=startRow+perPage return input.slice(startRow,endRow);})
    我认为@Pascal Winter正确地展示了您正在寻找的内容,最好的解决方案是通过过滤器将分页器绑定到当前页面列表。顺便说一下,当您传递
    pageNum
    perPage
    时,您甚至可以传递
    $scope
    或它的一个属性(函数?)。