在控制器中使用过滤器

在以前的项目中,只有在V层使用过过滤器,前面我也介绍过滤过滤器的使用,但是在angular这么强大的框架,是不可能让我们失望的。在C层controller中同样可以使用过滤器。

问题描述

查询的实现使用了过滤器,然后还要实现分页。这个过滤器如果还是像以前一样在V层使用过滤器,那么就会先实现分页,然后再去查询的时候,分页的数据不会改变。比如查询出10条数据,那么分页获取的数据总数就是10条,然后过滤掉3条,这时页面上就会显示7条数据,但是分页获取的数据总数还是10条,这样就出现了数据的不同步。

解决办法

1.如何在controller使用过滤器?

首先先介绍一下过滤器在controller中的使用。

1
2
3
4
angular.module('myApp')
.controller('myController', function($filter) {
...
});

首先在开始的时候将$filter注入进来

1
2
3
4
angular.module('myApp')
.controller('myController', function($filter) {
$filter('myFilter')(param1, param2...);
});

然后使用$filter来注入你自己定义的过滤器,第一个括号中是个自己的过滤器的名子,后面的过滤器的参数。值得注意的是,这里我们要将过滤的对象放在第一个参数的位置。

2.解决问题

1
<tbody ng-repeat="person in persons | yunzhiPersonnel: filterParams.qualifierCertificateType: filterParams.validityDate | yunzhiQualifierNumber: filterParams.number">

原来的过滤器我是这么使用的。现在将过滤器放到controller中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
// 提交查询
self.submit = function() {
$scope.filterParams = self.getFilterParams(); // 设置过滤条件
PersonnelPersonnelsupervisefileService.getAllBySpecification(self.getQueryParams(), function(data) {
$scope.persons = data; // 传入v层
// 在这里调用过滤器,原因是为了适应分页的使用,需要在分页之前执行完查询,否则会出现少数据的现象。
$scope.persons = $filter('yunzhiPersonnel')($scope.persons, $scope.filterParams.qualifierCertificateType, $scope.filterParams.validityDate);
$scope.persons = $filter('yunzhiQualifierNumber')($scope.persons, $scope.filterParams.number);
self.reload(); // 重新加载,显示分页
});
};
...

这样在每次查询的时候,都先将查询的结果过滤一下,然后再对过滤的结果进行分页,就不会在出现数据对不上的现象了。

官方参考:https://docs.angularjs.org/api/ng/filter/filter

坚持原创技术分享,您的支持将鼓励我继续创作!