AngularJS 过滤器

小数据量查询思路

考评员综合查询,查询条件有:区域、所在单位、从事专业、资格证名称、有效期至。javascript

clipboard.png

若是咱们的全部数据查询都放在后台的话。依据拼接的查询条件,选择区域、所在单位、从事专业查询的是人员表,而选择资格证名称、有效期至查询的是人员资质表。html

clipboard.png

查询都放到后台,这种以咱们固有的思路去设计是能够实现的。java

那就写两个接口,一个根据区域、所在单位、从事专业查询人员表,一个根据资格证名称、有效期至、区域、所在单位、从事专业查询人员资质表。不过是拼接谓语时多join几下罢了。angularjs

而后前台监听用户选中的查询条件,根据不一样的查询条件去请求相应的接口。web

虽然这样能够实现,可是此处的考评员的数量不会不少,咱们大能够根据区域、所在单位、从事专业查询人员,OneToMany直接将相应的人员资质带出来,而后再根据用户选中的资格证名称和有效期至做为条件对人员资质进行过滤,在前台过滤出用户想要的数据。数组

过滤器思路

过滤器,本质就是一个方法,输入什么,而后输出什么。ide

符合此处需求传入的参数应该为人员,资格证名称,有效期至,而后输出为处理过的人员。ui

过滤人员的人员资质,可能对于不熟悉本项目的人不容易理解,因此这里以人和电脑为例,一我的,能够有多个电脑,需求是将这我的的不符合过滤条件的电脑从数组中移除。this

webApp.filter('yunzhiComputer', function() {
    return function(users, computerName) {
        angular.forEach(users, function(user) {
            angular.forEach(user.computers, function(computer, index) {
                if (computer.name !== computerName) {
                    // 若是不符合条件,将该项从数组中移除
                    user.computers.splice(index, 1);
                }
            });
        });
        return users;
    };
});
ng-repeat="user in users | yunzhiComputer: 'Mac'"

V层过滤的问题

由于此处的考评员查询须要进行分页,由于数据量较少,因此计划在前台分页。spa

分页以后,那循环中的users就是咱们分页完的人。

假如一共有两页数据,每页十条,第一页有一条符合的,第二页有三条符合的,若是使用者在第一页进行过滤,那最后显示出来的就是一条数据,显示不出第二页符合条件的数据。

C层过滤

原来是先在C层分页,而后在V层进行过滤,为了不分页引发的数据过滤错误,因此决定将过滤器放到C层使用,先过滤,后分页。

Filter - AngularJS

angular.module('FilterInControllerModule', []).
controller('FilterController', ['filterFilter', function FilterController(filterFilter) {
  this.array = [
    {name: 'Tobias'},
    {name: 'Jeff'},
    {name: 'Brian'},
    {name: 'Igor'},
    {name: 'James'},
    {name: 'Brad'}
  ];
  this.filteredArray = filterFilter(this.array, 'a');
}]);

第一种是AngularJS官方给出的写法,直接过滤器名加上Filter能够直接依赖注入过滤器,例如咱们这里的过滤器叫作yunzhiComputer,咱们能够直接依赖注入yunzhiComputerFilter

How to use a filter in a controller - StackOverflow

function myCtrl($scope, $filter)
{
    $filter('filtername')(arg1,arg2);
}

这是StackOverflow上给出的写法,我比较喜欢这种写法,毕竟咱们写过滤器,为了防止和已有的库冲突,因此咱们要将过滤器加上前缀yunzhi,而后还要在命名上大体描述这个过滤器的功能,这就使得过滤器的名称很长,再加上Filter,那就更长了,彻底不必。毕竟$filter中的字符串仍是可让他人去直接粘贴而后Ctrl + P直接查询到这个过滤器。

相关文章
相关标签/搜索