2012-11-07 114 views
21

我有一組項目,我想過濾在ng重複使用ng模型作爲字符串過濾集,到目前爲止我還沒有找到一種方法,使其工作時,表達式被否定,我在做這樣的事情:Angularjs過濾器否定

documentation,它說,我們應該使用!否定表達,但仍然沒有運氣。

我在做什麼錯?

+1

如果您的過濾器是一種方法(不是字符串或模型)解決方案發布在這裏:http://stackoverflow.com/questions/13464809/reverse-polarity-of-an-angular-js-filter/17811582#17811582 –

回答

42

'!'字符,預先準備的過濾字符串,象下面這樣:

過濾器: '!' + 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> 
+1

這是問題所在。 '!'需要成爲一個角色。謝謝! – lgomezma

+0

使用'ng-options'而不是'ng-repeat'。 – EpokK

+0

v1.2.0rc1還支持這個嗎?我無法得到這個工作。 –

4

UPDATE:查看ENDOH takanao的回答。

看着AngularJS source code看起來'!'否定謂語的結果,而不是謂語本身

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

+0

這確實有效,但我想知道它是否不應該直接由AngularJS實現... – lgomezma

+0

這工作正常,如果您的模型爲每個選擇下拉是目的地本身,但如果它已附加到其他東西呢? – iamwhitebox

22

如果使用對象,你可能也有興趣在以下幾點:

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

在AngularJS 1.1.5中測試。

+2

它工作時obj_attr包含字符串值,但我應該如何指定不空或不''(空)的字符串? –

+0

這個例子爲我做了,但要注意,如果你想基於字符串不是空的過濾,它會看起來很糟糕,但仍然有效:'filter:{prop:'!'}'where'!'翻譯爲「不空」醜,但它的作品:) –

2

如果您使用的方法過濾的方法名稱前加'!'不管用。相反,你可以這樣做:

// 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> 

參考: https://stackoverflow.com/a/17811582/175830

1

我m使用1.3.15和ENDOH's解決方案無法正常工作。相反,filter:'!':languageOrigin爲我工作。