链接过滤器
问题描述:
我有一个大名单,我需要在ng-repeat
结合并表现得可怕,所以我发现这个链接:链接过滤器
http://tech.small-improvements.com/2013/09/10/angularjs-performance-with-large-lists/
并实现了他们做了同样的分页用他们的自定义过滤器startFrom
:
angular.module('myApp').filter('startFrom', function() {
return function (input, start) {
if (input) {
return input.slice(start);
}
};
});
这个改进的性能到这是可以接受的地步,但它打破了以往的过滤我在做什么。现在,如果我想搜索一个项目,只有当我在包含该项目的页面上时才会起作用。我的理解是,过滤器应该是可链接的,但如果我这样做:
<tr ng-repeat="r in foo| filter:query:strict | startFrom: currentPage * pageSize |
limitTo:pageSize | orderBy:['type','code']">
看来,orderBy
首先应用,然后startFrom
,只有最后filter
。我原本在startFrom
之后有filter
,结果相同。那么我怎样才能让这个startFrom
之后第一次申请filter
?
答
您可以想象currentPage * pageSize
会返回一些值,例如10。这意味着即使您的过滤器适用于它们,前10项也会被跳过。当搜索更改为包含起始项目时,startFrom
过滤器必须更新为第0页。
您可以通过观察对query
的更改并重置页面来做到这一点,以便显示数组的较早值。
'currentPage * pageSize'可能不会在'query'时更新。 – 2015-03-13 20:10:35
@ExplosionPills:这会很有意义。我想我需要一个'$ watch'。 – 2015-03-13 20:15:04
@ExplosionPills:其实,就是这样。当过滤器改变并且它工作时,我在我的'query'上加上了一个监视器来将'currentPage'重置为'0'。如果您想为此添加答案,我会接受它。 – 2015-03-13 20:21:31