Angular пример компаратора функционального фильтра
Может ли кто-нибудь дать мне пример того, как использовать компаратор фильтра Angular?
Из официального документа:
функция (фактическая, ожидаемая): функции будет присвоено значение объекта и значение предиката для сравнения и должно возвращать значение true, если элемент должен быть включен в результат фильтрации.
Существует отличное сообщение в блоге о фильтре Angular:
Развлечения с фильтрами AngularJS - Часть 1: фильтр filter
Однако в конце этого, где я ищу полезный пример компаратора функций, я все еще ничего не нашел.
Для более конкретных требований соответствия вы можете передать функцию вместо логического значения в качестве аргумента компаратора.
Я пробовал несколько комбинаций сам. Не добавляя функцию в конце выражения или указывая на функцию в области, выполняйте работу.
Ответы
Ответ 1
Я сделал что-то вроде этого, так как Angular выполняет итерации по объектам и пытается сравнить их целиком, а также рекурсивно их индивидуальные свойства.
// in your controller
$scope.filterMyData = function (input, search_param) {
if (input && input.propertyWeCareAbout) {
// it ugly, but to quickly get something done you can ignore search_param
return input.propertyWeCareAbout === $scope.SomeOtherData;
}
else {
return angular.equals(input, search_param);
}
}
<span>Quick search: </span><input type="search" ng-model='quickSearch'/><br/>
<table>
<tr ng-repeat="obj in someHttpService.dataAsArray | filter:quickSearch:filterMyData">
<td>{{ obj.key }} </td>
<td>{{ obj.propertyWeCareAbout }}</td>
</tr>
</table>
Ответ 2
ПОДРОБНОЕ ОПИСАНИЕ НА КАК filter : expression : comparator
работает.
Это синтаксис фильтра:
data | filter: expression : comparator
Встроенная функция filter
, встроенная в AngularJS, обеспечивает нестандартный поиск подстроки по переданным данным, сравнивая с expression
, когда выражение представляет собой строку или свойство объекта, подверженного фильтру. comparator
дает вам возможность дальнейшего уточнения фильтра. Если вы просто укажете comparator
как true
, это гарантирует, что возвращаются только те элементы, которые являются точным совпадением с expression
. Более гибкий подход заключается в том, чтобы указать comparator
как функцию, которая возвращает функцию предиката .
<сильные > Примеры
Со следующими данными, отображаемыми в представлении $scope
как люди:
var people = [
{name:'John Jones',location:'Peterborough'},
{name:'Angela Atkinson',location:'Jersey'},
{name:'Peter Peterjon',location:'Attleborough'}
];
Мы создадим простое окно ввода ввода в представлении, которое мы дадим в качестве параметра выражения фильтра:
<input type="text" ng-model="searchText" placeholder="Search People">
1) БЕЗ КОМПАРАТОРА
Результаты поиска будут выводиться, когда мы вызываем фильтр:
<p ng-repeat="person in people | filter : searchText">{{person.name}} {{person.location}}</p>
Если мы введем "J" в поле поиска, потому что все записи имеют j где-то, результат все равно покажет все 3 записи.
Демо: https://plnkr.co/edit/VID2CAKvUI5mjgKLImaI?p=preview
2) С COMPARATOR AS true
<p ng-repeat="person in people | filter : searchText : true">{{person.name}} {{person.location}}</p>
Ввод "J" не покажет никаких результатов, так как не существует поля, которое точно совпадает с J. Мы получим результат, только если набирается одно из следующих значений (с учетом регистра):
- Джон Джонс
- Питерборо
- Анжела Аткинсон
- Джерси
- Питер Петерджон
- Attleborough
Демо: https://plnkr.co/edit/hhw2u03egXsUo7IyGc1w?p=preview
3) С COMPARATOR AS function
Мы добавим функцию предиката