0

我有一些这样的数据:

people = [
    {
        names: [
            {first: "Joe", last: "Smith"}, 
            {first: "Joseph", last: "Smith"}, 
            ...
        ]
    }, 
    ...
]

换句话说,一个对象数组和一个名称数组。例如,可以将一个人称为“Joe Smith”或“Joseph Smith”。如何使用过滤器仅搜索名称的第一个元素?IE:如果我输入“Jo”或“Smith”,它会找到第一人称。但是,如果我输入“seph”,它不会。

我一直在查看此页面上的示例,但实际上并没有过滤数组内部的示例。这是我尝试过的,但它给了我一个错误:

<input ng-model="search.names[0].$">

TypeError:无法设置未定义的属性“$”

4

2 回答 2

1

工作代码

输入 HTML

<input ng-model="searchTerm">

结果

<tr ng-repeat="p in people | filter:searchFunc">...</tr>

控制器

$scope.searchFunc = function(person) {
    var firstPersonsName = [person.names[0]]; // Wrapping in array since the 'filter' $filter expects an array
    var matches = $filter('filter')(firstPersonsName, $scope.searchTerm); // Running firstPersonsName through filter searching for $scope.searchTerm
    return matches.length > 0;
}

Plunker 演示


回答标题中的问题

我玩过,filter当为它指定一个模式对象时,你似乎不能超过一个层次,例如ng-model="search.names"有效但ng-model="search.names.otherVal"没有。

另外,即使filter支持超过一级深度,你仍然无法做到ng-model="search.names[0]"。这是因为filter期望输入是一个数组,但是您的名称数组的元素都是对象,例如 people[0].names[0] == {first: "Joe", last: "Smith"},因此过滤永远不会起作用。

纯粹通过视图来完成您所要求的事情并且在您的控制器中没有额外代码的唯一方法是创建您自己的自定义过滤器来处理您的情况。

于 2013-08-01T00:56:17.107 回答
1

这会奏效吗?

说你的输入是

<input ng-model="search.name" type="text">

然后,您可以显示如下结果:

<div ng-repeat="person in people[0].names | filter: alias">...</div>

控制器:

$scope.alias = function (object) {
  if (object.first.match(new RegExp($scope.search.name))) {
    return true;
  }

  return false;
};
于 2013-08-01T00:19:30.907 回答