Angularjs过滤器被否定

Angularjs过滤器被否定,angularjs,Angularjs,我有一组要在ng repeat中过滤的项,使用ng模型作为字符串来过滤该集,到目前为止,我还没有找到一种方法使其在表达式被求反时工作,我正在执行类似的操作: <select ng-model="languageOrigin" ng-change="updatePrice()"> <option ng-repeat="language in languages">{{language}}</option> </select>

我有一组要在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>

{{语言}}
{{语言}}
最后,它说我们应该使用!否定这个表达,但仍然没有运气


我做错了什么

更新:参见ENDOH takanao的答案

看看AngularJS,似乎是“!”否定谓词的结果,而不是谓词本身:

因此,解决这个问题的一种方法是[如果您不喜欢“!”+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>


示例。

'!'将字符前置到筛选器字符串,如下所示:

过滤器:“!”+语言起源


{{语言}}
{{语言}}

如果使用对象,您可能还对以下内容感兴趣:

<li data-ng-repeat="obj in objs | filter:({obj_attr: '!obj_val'})">
   ...
</li>
  • ...

  • 在AngularJS 1.1.5中测试。

    如果您使用方法进行过滤,请在方法名称前加上“!”这是行不通的。相反,您可以执行以下操作:

    // 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>
    
    
    {{语言}}
    
    参考:

    我使用的是1.3.15,解决方案不起作用。相反,
    filter:“!”:languageOrigin为我工作。

    要完全否定$filter筛选器,我添加了以下筛选器:

    .filter('$nfilter', ['$filter', function($filter) {
        return function() {
            var itemsToExclude = $filter('filter').apply(null, arguments);
            return arguments[0].filter(x => !itemsToExclude.includes(x));
        }
    }])
    
    在模板中,我们可以编写:

    <ui-select-choices repeat="type.id as type in data.types | $nfilter:{id: form.typeId}:true | filter: {label: $select.search}">
        <div ng-bind-html="type.label | highlight: $select.search"></div>
    </ui-select-choices>
    
    
    
    这确实有效,但我想知道是否不应该由AngularJS直接实现……如果每个select下拉列表的模型都是目的地本身,那么这很好,但是如果它已经附加到其他对象上呢?这就是问题所在。“!”需要成为一个角色。谢谢在select上使用
    ng选项
    ,而不是
    ng repeat
    。v1.2.0rc1是否仍支持此功能?我无法实现此功能。1.2.14@DaviDrivers中仍然支持此功能注意:如果筛选器是一个方法,则需要执行一些操作,例如,如果筛选器是一个方法(不是字符串或模型),则在此处发布解决方案:当obj_attr包含字符串值时,此功能有效,但我应该如何指定NOTNULL?或者不是“”(空)字符串?这个例子对我来说就是这样,但是要注意,如果你想基于非空字符串进行筛选,它看起来很糟糕,但仍然有效:
    filter:{prop:'!'}
    where'!'简单地翻译为“notempty”。难看,但它能工作:)
    .filter('$nfilter', ['$filter', function($filter) {
        return function() {
            var itemsToExclude = $filter('filter').apply(null, arguments);
            return arguments[0].filter(x => !itemsToExclude.includes(x));
        }
    }])
    
    <ui-select-choices repeat="type.id as type in data.types | $nfilter:{id: form.typeId}:true | filter: {label: $select.search}">
        <div ng-bind-html="type.label | highlight: $select.search"></div>
    </ui-select-choices>