我尝试实现一个返回列表的过滤器以及divider的条目。此过滤器也可以使用TextSearch。
模板:
<input type="search" placeholder="Search" ng-model="searchText" autocorrect="off" >
<li class="item item-checkbox"
ng-repeat="destination in destinations | (a)
destinationFilter:searchText:true" (b)
ng-class="destination.letter? 'item-divider':''"> (c)
过滤:
app.filter('myFilter', function() {
return function(input, key, startsWith) {
if(input){
var filteredInput = []; (1)
var lastChar = ''; (2)
var re = /.*/i; (3)
if(key){
if(startsWith) (4)
key = "^"+key;
re = new RegExp(key, "i");
}
for(var i=0; i<input.length; i++){
var item = input[i];
if(item.name.match(re)){ (5)
if(item.name.charAt(0) !== lastChar) { (6)
filteredInput.push({name:item.name.charAt(0),letter:true});
lastChar = item.name.charAt(0);
}
filteredInput.push(item); (7)
}
};
return filteredInput;
}
return input;
};
});
不幸的是,这个过滤器通常由30个元素的列表调用。它也会导致此错误:
Error: [$rootScope:infdig] http://errors.angularjs.org/1.2.25/$rootScope/infdig?
我猜输入的每个元素都添加了分隔符。看起来很奇怪。
FIDDLE:HERE
答案 0 :(得分:1)
问题是你的过滤器会在每次调用时生成一个新数组,这会导致角度为infinite loop。
您最好提供ng-repeat
一个常量数组而不是函数(过滤器)。
在您的示例中,可以通过在控制器中应用过滤器而不是视图来完成(尽管您的真实案例可能不同):
$scope.filtered = $filter('destinationFilter')($scope.destinations, undefined, true);
在你的HTML中:
<li class="item item-checkbox" ng-repeat="destination in filtered" ng-class="destination.letter? 'item-divider':''" >
请参阅此fiddle。