Подтвердить что ты не робот

Фильтр 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>

В документации говорится, что мы должны использовать! чтобы отрицать выражение, но все равно не повезло.

Что я делаю неправильно?

4b9b3361

Ответ 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 работал у меня.