angular的多个过滤条件filter怎么在controller中写

例如:

ng-repeat="proj in projects | filter:{'years':mySelectStr} | filter:tidFilter | filter:{'content':searchName} "

这种同时存在的多个过滤条件,在controller中应该怎么写?

阅读 5k
1 个回答

第一种方式就是在controller中就是一次调用,其实对于template中关于filter的管道语法内部实现也是依次调用。

var res = $filter('filter1')($scope.data, ...)
    res = $filter('filter2')(res, ...)
    res = $filter('filter3')(res, ...)
 
// 或者
var res = $filter('filter1')($filter('filter2')($filter('filter3')($scope.data, ...), ...), ...)

第二种方式涉及一些函数式编程的知识,因为$filter本身注册的函数其实本质是符合函数式编程中纯函数pointfree的特征的,如果多个函数都是纯函数的前提下且有pointfree特征,那它们是可组合的,即可以使用类似lodash.compose或者ramda.compose的函数来生成一个新函数,如下

import _ from 'lodash'

var composedFilter = _.compose($filter('filter3'), $filter('filter2'), $filter('filter1'))

var res = composedFilter($scope.data, ...)

以上

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进