2012-11-07 7 views
21

私はng-repeatでフィルタリングしたい項目のセットをフィルタリングする文字列としてng-modelを使用していますが、これまでのところ、否定されて、私はこのような何かをやっている: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-repeat'の代わりに' ng-options'をselectに使います。 – EpokK

+0

これはまだv1.2.0rc1でサポートされていますか?私はこれを働かせることはできません。とにかくこれを無効にするには –

4

更新:ENDOHのtakanaoの答えを参照してください。

AngularJS source codeを見ると、「!」と表示されます。 [「!」あなたは+ myFilterを構文が気に入らない場合は、]あなたはできる

var search = function(obj, text){ 
    if (text.charAt(0) === '!') { 
     return !search(obj, text.substr(1)); 
    } 
    switch (typeof obj) { 
    ... 

ので、これを回避する一つの方法は、にある:述部の結果を否定し、述語自体ありませんお使いのコントローラで独自の述語関数を定義します。

$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: '!'}'どこに '!醜いですが、それは動作します:) –

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); 
    } 
}; 

を次にあなたが実行します。

<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

私は」あなたのHTML内

filter:not(myFilterMethod) 

それは次のようになります。 1.3.15とENDOH'sを使用していますが解決しませんでした。代わりに、filter:'!':languageOriginが私のために働いた。

関連する問題