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