在AngularJS中按名字的第一个字母过滤人员列表

时间:2016-04-20 10:14:22

标签: javascript angularjs

我试图通过AngularJS转发器中的第一个名字的起始字母来过滤人员列表。

转发器如下:

<li ng-repeat="person in people | orderBy: 'firstname' | firstLetter:'firstname':'A'">
    <a ui-sref="people.details({ personId: {{person.id}} })">
        <span class="list__icon"><img src="img/avatar.png"></span>
        <span class="list__text">
            <span class="list__text__name">{{person.firstname}} <b>{{person.lastname}}</b></span>
        </span>
    </a>
</li>

所以我按名字命名,然后使用名为firstLetter的自定义过滤器:

.filter('firstLetter', function () {
    return function (input, letter) {
        input = input || [];
        var out = [];
        input.forEach(function (item) {
            if (item.charAt(0).toLowerCase() == letter) {
                out.push(item);
            }
        });
        return out;
    }
});

但是我收到charAt不是函数的错误...我是否错误地将参数传递给过滤器?

2 个答案:

答案 0 :(得分:2)

是的,您传递的参数未正确过滤。默认过滤输入,即您的数组将作为第一个参数传递。

.filter('firstLetter', function () {
    return function (objects, input, letter) {
        var out = [];
        angular.forEach(objects,object){
            var item = object[input];
            if (item.charAt(0).toLowerCase() == letter.toLowerCase()) {
                out.push(object);
            }
        });
        return out;
    }
});

答案 1 :(得分:2)

您的firstLetter过滤器缺少额外的参数。第一个参数input指的是重复通过的数组(在本例中为人)。第二个参数letter实际上应该是过滤器声明的第三个参数。

.filter('firstLetter', function () {
    return function (input, key, letter) {
        input = input || [];
        var out = [];
        input.forEach(function (item) {
            console.log('item: ', item[key][0].toLowerCase());
            console.log('letter: ', letter);
            if (item[key][0].toLowerCase() == letter.toLowerCase()) {
                out.push(item);
            }
        });
        return out;
    }
});;