Фильтр Angularjs отрицается
У меня есть набор элементов, которые я хочу фильтровать в ng-repeat, используя ng-модель в качестве строки для фильтрации набора, до сих пор я не нашел способ заставить его работать, когда выражение отрицается, Я делаю что-то вроде этого:
<select ng-model="languageOrigin" ng-change="updatePrice()">
<option ng-repeat="language in languages">{{language}}</option>
</select>
<select ng-model="languageDestination" ng-change="updatePrice()">
<option ng-repeat="language in languages | filter:!languageOrigin">{{language}}</option>
</select>
В документации говорится, что мы должны использовать! чтобы отрицать выражение, но все равно не повезло.
Что я делаю неправильно?
Ответы
Ответ 1
'!' символ добавляется к строке фильтра, как показано ниже:
фильтр: '!' + LanguageOrigin
<select ng-model="languageOrigin" ng-change="updatePrice()">
<option ng-repeat="language in languages">{{language}}</option>
</select>
<select ng-model="languageDestination" ng-change="updatePrice()">
<option ng-repeat="language in languages | filter:'!'+languageOrigin">{{language}}</option>
</select>
Ответ 2
При использовании объектов вам также может быть интересно:
<li data-ng-repeat="obj in objs | filter:({obj_attr: '!obj_val'})">
...
</li>
Протестировано в AngularJS 1.1.5.
Ответ 3
ОБНОВЛЕНИЕ: см. ответ ENDOH takanao.
Глядя на исходный код AngularJS , кажется, что '!' отрицает результат предиката, а не сам предикат:
var search = function(obj, text){
if (text.charAt(0) === '!') {
return !search(obj, text.substr(1));
}
switch (typeof obj) {
...
Итак, один из способов обойти это -. Если вам не нравится синтаксис '!' + myFilter, вы можете определить свою собственную предикатную функцию в своем контроллере:
$scope.inverseOriginFilter = function(item) {
return item.search($scope.languageOrigin) == -1
}
Затем используйте его в своем HTML:
<select ng-model="languageDestination" ng-change="updatePrice()"
ng-options="language for language in languages | filter:inverseOriginFilter">
</select>
Пример fiddle.
Ответ 4
Если вы используете метод для фильтрации, чем префикс имени метода с помощью '!' не будет работать. Вместо этого вы можете сделать что-то вроде:
// You can register this in your AppCtrl if you like, otherwise just use $scope.
$rootScope.not = function(func) {
return function (item) {
return !func(item);
}
};
Затем выполните следующие действия:
filter:not(myFilterMethod)
В вашем html это будет выглядеть так:
<select ng-model="languageDestination" ng-change="updatePrice()">
<option ng-repeat="language in languages | filter:not(languageOrigin)">{{language}}</option>
</select>
Ссылка:
fooobar.com/questions/59250/...
Ответ 5
Я использую 1.3.15, а решение ENDOH не работает. Вместо этого filter:'!':languageOrigin
работал у меня.