2015-04-20 3 views
48

В настоящее время я использую текстовый ввод, чтобы отфильтровать список элементов. Я хотел бы сделать это, когда определенная переменная задана, список не фильтрует, независимо от того, что представляет собой текстовый ввод. Любые советы о том, как я могу это сделать?Создание углового фильтра условного

<a ng-repeat="set in data | filter: { value: search }" data-id="{{set.id}}" ng-mousedown="setBox(set)" ng-mouseover="setSelected(set, $event)" ng-bind-html="set.value | trustHTML"></a> 
+0

возможно дубликат [условно применять фильтры с нг-повтора] (HTTP: //stackoverflow.com/questions/17206062/condition-apply-filters-with-ng-repeat) – Aaron

+0

Я предполагаю, что это может быть дубликат ... хотя я не могу сказать, что я доволен предоставленным ответом :) – RhoVisions

ответ

82

Вы можете добиться этого, если вы установите выражение фильтра на '' (или undefined) - это приводит к тому, что фильтр не применяется - если установлено значение disableFilter или иное выражение фильтра.

Таким образом, если предположить, это переключая переменная - disableFilter - это логическое значение:

<a ng-repeat="set in data | filter: (!disableFilter || '') && filterExpression"> 

filterExpression быть все, что выражение вы хотите фильтровать). Ваш конкретный случай будет:

<a ng-repeat="set in data | filter: (!disableFilter || '') && {value: search}"> 

EDIT:

Чтобы объяснить, как вышеуказанные работы.

  1. Помните, что || и && возвращают значение одного из операндов.
  2. || и && использование оценка короткого замыкания - true || (anything) возвращение true; false && (anything)false - не оценивая выражение (anything).
  3. '' является falsy (или использовать undefined вместо этого, если это понятнее)

И так,

когда disableFilter === true, !disableFilter === false, таким образом, второй операнд || - пустая строка '' - вычисляется (это falsy), и (!disableFilter || '') возвращает '' - значение ложности, которое замыкает замыкание на && и не оценивает второй операнд &&. Таким образом, возвращаемое значение выражения равно ''.

, когда disableFilter === false, !disableFilter === true, который замыкает замыкание на ||, затем оценивается и возвращается второй операнд &&. Возвращаемым значением выражения является, таким образом, {value: search}.

Подробнее о logical operators here

+0

Awesome! Это было то, что я пытался сделать! но я не совсем понимаю это и надеюсь, что вы можете изложить. Разве это не означает, что 'disableFilter' является ложной или пустой строкой? Я не понимаю, как это приравнивается. – RhoVisions

+0

@RhoVisions, я обновил ответ с объяснением –

+0

Это замечательно! Я полностью пренебрег тем, что в JS логика между небулевыми значениями по-прежнему оценивается как истина или ложь, как вы выразились. Я думаю, что пустая строка, фальшивка, отбросила меня. – RhoVisions

6

Возможно использование ng-if?

<a ng-if="!myConditional" ng-repeat="set in data" data-id="{{set.id}}" ng-mousedown="setBox(set)" ng-mouseover="setSelected(set, $event)" ng-bind-html="set.value | trustHTML"></a> 
<a ng-if="myConditional" ng-repeat="set in data | filter: { value: search }" data-id="{{set.id}}" ng-mousedown="setBox(set)" ng-mouseover="setSelected(set, $event)" ng-bind-html="set.value | trustHTML"></a> 

Это похоже на solution.

+0

Это работа, но если мы хотим знать длину массива (для бесконечного прокрутки), мы не можем ...:/ – PositivProd

-1

сделать функции и комбинировать с filterExpression.

Пример У меня есть список студентов, как показано ниже:

$scope.students = [ 
    { name: 'Hai', age: 25, gender: 'boy' }, 
    { name: 'Hai', age: 30, gender: 'girl' }, 
    { name: 'Ho', age: 25, gender: 'boy' }, 
    { name: 'Hoan', age: 40, gender: 'girl' }, 
    { name: 'Hieu', age: 25, gender: 'boy' } 
]; 

Я хочу, чтобы отфильтровать студентов по признаку пола быть мальчик и фильтр по имени их.

Сначала я создать функцию с именем «filterbyboy» следующим образом:

$scope.filterbyboy = function (genderstr) { 
    if ((typeof $scope.search === 'undefined')||($scope.search === '')) 
    return (genderstr = "") 
    else 
    return (genderstr = "boy"); 
}; 

Explaination: если не фильтрует имя отображение всех студентов еще фильтр по имени входа и пола, как «мальчик»

Здесь представляет собой демо-версию How to use and operator in AngularJs example

6

Вот что я сделал. Во-первых, у меня был отборный контроль, населенную из моего контроллера, с одной статической позиции (Select ...) со значением строки нулевой длины:

<select data-ng-model="districtFilter" class="form-control" data-ng-options="d.DistrictId as d.DistrictName for d in districts | orderBy: 'DistrictName'"><option value="">Select...</option></select> 

Тогда я применил фильтр условно на столе. Она появляется, когда фильтр имеет нулевое значение, установив его на неопределенный очищает его:

<tr data-ng-repeat="courtEntity in courts | filter:{ 'DistrictId' : districtFilter === null ? undefined : districtFilter}"> 
+0

Я просто использую terneary как . – Sumant

39

Я думаю, что следующее немного менее сложное решение. Трудные решения вызывают ошибки для будущих разработчиков.

Вот мое предложение:

<a ng-repeat="set in data | filter: (shouldFilter ? filterExpression : '')"> 

или

<a ng-repeat="set in data | filter: (shouldFilter ? {value: search} : '')"> 

Просто, если shouldFilter, то дать ему выражение фильтра, в противном случае не дать ему ничего. Использование простого трехмерного выражения будет легче для удобства чтения.

+3

Очень простой и понятный. Благодаря! –

+3

Мне нравится это для лучшей читаемости. –

+0

Спасибо человек. очень легко схватить :) –

0

У меня был сложный случай

  • есть список записей говорят, что продукты
  • Фильтр по двум другим свойством prop1, prop2 выбирается пользователем из выпадающего
  • другой выпадающего списка (prop3) имеют два значение 1 и 2, если пользователь выбрать 2 фильтр не следует применять

Это мой результат:

ng-repeat="prod in filterdProd = 
(products | filter : model.prop3 == 2 ? '' : 
    { 'prop1': model.prop1 || 'none', 
    'prop2': model.prop2 }) | 
    orderBy: 'productrName'" 

если model.prop3 == 2 ? '' фильтр не будет применяться в противном случае ...

Мы также можем использовать количество записей с помощью filterdProd

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