2016-04-14 2 views
1

у меня есть простой нг-повторить подобное:Как использовать угловой фильтр по нескольким свойствам объекта

<input type="text" ng-model="vm.filter"> 

<div ng-repeat="tenant in vm.tenants | filter : vm.filter : vm.contains"> 
</div> 

Теперь я хочу, чтобы фильтровать жильцов на основе значения фильтра, например, найти, если имя арендатора содержит выражение фильтра, как тот

function contains(actual, expected) { 
      return actual.name.indexOf(expected) >= 0; 
     } 

То, что я не понимаю, почему я получаю tenant.name в содержит функцию вместо самого tenant. Я знаю, что для простого случая я могу сделать что-то вроде filter | {name: vm.filter} | vm.contains, но что делать, если я хочу сделать фильтрацию на основе нескольких свойств (например, имя, телефон и т. Д.)

ответ

1

То, что я не понимаю, - это то, почему я получаю tenant.name в функции вместо самого арендатора.

Что происходит, так это то, что угловой обеспечивает компаратор на всех уровнях объекта в попытке сделать глубокую фильтрацию, то есть пытается сопоставить ваш фильтр со всеми уровнями иерархии в объекте. Если вы выполните console.log все значения, вы увидите, что вы также получите полный объект (после всех свойств).


Один из способов сделать эту работу было бы что-то вроде

... 
<div ng-repeat="tenant in vm.tenants | filter : vm.contains(vm.filter)"> 
... 

, а затем

... 
contains: function(filter) { 
    return function(tenant) { 
    return tenant.name.indexOf(filter) !== -1; 
    } 
} 
... 

Fiddle - https://jsfiddle.net/81384sd7/

+0

Да, я понял это, отлаживая, что он делает глубокое сравнение. Есть ли способ не делать этого? Я хочу иметь свою собственную логику в предоставляемой функции на основе самого объекта, но по какой-то причине кажется невозможной. –

+0

. Вы можете поместить свою функцию фильтрации в качестве первого параметра для фильтрации и прямого использования vm.filter из области действия или сделать что-то вроде https://jsfiddle.net/u9rq7afk/ (введите 'abc', чтобы получить 2 подходящих арендатора) – potatopeelings

+0

Да, спасибо, что, похоже, это трюк, я пропустил, что параметр выражения может принять эту функцию. –

0

Вам нужно проверить наличие обоих этих условий и вернуть значение, если они присутствуют. Что-то вроде этого:

function contains(actual, expected) { 
    if (actual.name.indexOf(expected) >= 0 && actual.phone.indexOf(expected) >= 0) { 
    return actual; 
    } 
} 
+0

Проблема заключается не в том, что я не могу проверить для функции внутри, но что угловой дает мне свойства в объекте, а не сам объект ... –

+0

Я исправил ошибку в решении. Похоже, вам нужно вернуть весь «фактический» объект вместо одного свойства. –

+0

Фактический объект вообще не существует. Я бы ожидал, что фактическое будет, например, {name: «1», телефон «2»}, вместо этого я получаю «1» сразу в функции contains –

1

Вы можете использовать объект для хранения фильтров, которые хотите применить. Например:

$scope.filterBy = { 
    name: "Bob", 
    phone: "07" 
}; 

Затем настройте поля для редактирования фильтров:

<input type="text" ng-model="filterBy.name" /> 
<input type="text" ng-model="filterBy.phone" /> 

Тогда просто фильтровать по этому объекту.

<div ng-repeat="tenant in vm.tenants | filter : filterBy"> 

Посмотрите на мой предыдущий ответ, который очень похож, за исключением также позволяет выбор быть сделаны до того, как фильтр применяется вручную с помощью кнопки:

Applying a angularjs filter after "Apply" button click

Я надеюсь, это помогает.

+0

Хотя это, вероятно, будет работать, если я создам специально созданный объект с дубликатом моей строки, но я действительно хочу иметь та же строка, сопоставляемая с различными свойствами одного объекта. –

+0

Итак, вы хотите увидеть, существует ли, например, «Боб» в tenant.name, tenant.phone и т. Д.? По существу, если он соответствует любому свойству? Если это так, я считаю, что это стандартная функция, если вы просто передаете фильтр в строку. – anierzad

+0

Да, это правильно, но я не хочу, потому что могут быть внутренние свойства, свойства, которые не связаны, и т. Д. Вот почему я просто добавил для себя свою собственную функцию. –

Смежные вопросы