ng-repeat: фильтр по одному полю

397

У меня есть массив продуктов, которые я повторяю, используя ng-repeat и использую

<div ng-repeat="product in products | filter:by_colour"> 

чтобы фильтровать эти продукты по цвету. Фильтр работает, но если имя/описание продукта и т.д. Содержит цвет, то продукт остается после применения фильтра.

Как настроить фильтр только для поля цвета моего массива, а не для каждого поля?

Теги:
angularjs-filter
ng-repeat

10 ответов

409
Лучший ответ

См. пример на странице filter. Используйте объект и задайте цвет в свойстве цвета:

Search by color: <input type="text" ng-model="search.color">
<div ng-repeat="product in products | filter:search"> 
  • 0
    Спасибо Марк, есть ли какая-то польза от этого, а не от метода, предложенного ниже?
  • 7
    @ Seglespaan, не совсем. Вы можете обнаружить, что метод, представленный bmleite и blesh, выглядит лучше, так как вы можете видеть, что вы фильтруете по цвету. Этот метод более компактен, что может быть полезно, если вы хотите выполнять поиск по нескольким свойствам, и вы не хотите иметь длинный объект в HTML: filter:{ color: '...', size: '...', ...}
Показать ещё 3 комментария
529

Укажите свойство (т.е. colour), в которое вы хотите применить фильтр:

<div ng-repeat="product in products | filter:{ colour: by_colour }">
  • 5
    что если я хочу! by_colour как фильтр: {color:! by_colour} "
  • 26
    @rjdmello просто добавьте '!'+ , например, <div ng-repeat="product in products | filter:{ colour: '!'+by_colour }">
Показать ещё 7 комментариев
154

Вы можете фильтровать объект с свойством, соответствующим объектам, которые вы должны фильтровать на нем:

app.controller('FooCtrl', function($scope) {
   $scope.products = [
       { id: 1, name: 'test', color: 'red' },
       { id: 2, name: 'bob', color: 'blue' }
       /*... etc... */
   ];
});
<div ng-repeat="product in products | filter: { color: 'red' }"> 

Это, конечно, может быть передано переменной, как предположил Марк Райкок.

  • 2
    допустим, у меня есть такой вид scope.products: {id: 1, name: 'test', color: 'lightblue'}, {id: 2, name: 'bob', color: [{foreground: black, background : white}]}. тогда как я могу отфильтровать продукт по цвету: фон, чтобы получить значение белого?
  • 2
    @Gery: Честно говоря, я не думаю, что вы можете. В любом случае, использование фильтра: вообще плохая практика, ИМО. В том смысле, что, по вашему мнению, логика должна быть в вашем контроллере и не очень тестируема.
Показать ещё 1 комментарий
89

Если вы хотите отфильтровать внука (или глубже) данного объекта, вы можете продолжать строить свою иерархию объектов. Например, если вы хотите отфильтровать "thing.properties.title", вы можете сделать следующее:

<div ng-repeat="thing in things | filter: { properties: { title: title_filter } }">

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

<div ng-repeat="thing in things | filter: { properties: { title: title_filter, id: id_filter } }">
  • 2
    это как 'или' тип или 'и' тип фильтра.
  • 1
    Тот же вопрос заключается в том, что И или ИЛИ при фильтрации более одного свойства?
Показать ещё 2 комментария
75

Лучший способ сделать это - использовать функцию:

HTML

<div ng-repeat="product in products | filter: myFilter">

Javascript

$scope.myFilter = function (item) { 
    return item === 'red' || item === 'blue'; 
};

В качестве альтернативы вы можете использовать ngHide или ngShow для динамического отображения и скрытия элементов на основе определенных критериев.

57

Будьте осторожны с фильтром angular. Если вы хотите выбрать определенное значение в поле, вы не можете использовать фильтр.

Пример:

Javascript

app.controller('FooCtrl', function($scope) {
   $scope.products = [
       { id: 1, name: 'test', color: 'lightblue' },
       { id: 2, name: 'bob', color: 'blue' }
       /*... etc... */
   ];
});

HTML

<div ng-repeat="product in products | filter: { color: 'blue' }"> 

Это выберет оба, потому что используйте что-то вроде substr
Это означает, что вы хотите выбрать продукт, где "цвет" содержит строку "синий", а не где "цвет" - "синий".

  • 84
    <div ng-repeat="product in products | filter: { color: 'blue' }:true"> будет работать только с точными совпадениями (в конце 'true' является аргументом компаратора: ссылка
8

Если вы должны были сделать следующее:

<li class="active-item" ng-repeat="item in mc.pageData.items | filter: { itemTypeId: 2, itemStatus: 1 } | orderBy : 'listIndex'"
                id="{{item.id}}">
    <span class="item-title">{{preference.itemTitle}}</span>
</li>

... вы не только получите предметы itemTypeId 2 и itemStatus 1, но также получите предметы с элементами Item 20, 22, 202, 123 и itemStatus 10, 11, 101, 123. Это связано с тем, что фильтр: Синтаксис {...} работает как строка, содержащая запрос.

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

<li class="active-item" ng-repeat="item in mc.pageData.items | filter: { itemTypeId: 2, itemStatus: 1 } : true | orderBy : 'listIndex'"
                id="{{item.id}}">
    <span class="item-title">{{preference.itemTitle}}</span>
</li>
7

Поиск по цвету:

     <input type="text" ng-model="searchinput">

     <div ng-repeat="product in products | filter:{color:searchinput}">

вы также можете сделать внутреннее гнездо.

Фильтр: {prop1: {innerprop1: searchinput}}

4

Мой путь - это

subjcts is

[{"id":"1","title":"GFATM"},{"id":"2","title":"Court Case"},{"id":"3","title":"Renewal\/Validity"},{"id":"4","title":"Change of Details"},{"id":"5","title":"Student Query"},{"id":"6","title":"Complains"}]

sub - поле ввода или любое другое, что вам нравится

Отображается следующим образом

<div ng-if="x.id === sub" ng-repeat=" x in subjcts">{{x.title}}</div>
  • 0
    В общем, использование ng-if является чистым решением
3

Вы должны использовать   filter:{color_name:by_colour} вместо

filter:by_colour

Если вы хотите совместить с одним свойством объекта, тогда напишите это свойство вместо объекта, иначе какое-либо другое свойство получит совпадение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню