22

セットをフィルタリングするための文字列として ng-model を使用して ng-repeat でフィルタリングしたいアイテムのセットがありますが、これまでのところ、式が否定されたときにそれを機能させる方法を見つけていません。このようなことをしています:

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

ドキュメントでは、! を使用する必要があると書かれています。式を否定しますが、それでも運はありません。

私は何を間違っていますか?

4

6 に答える 6

43

「!」以下のように、文字列をフィルター文字列の先頭に追加します。

filter:'!'+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>
于 2012-11-19T09:08:36.670 に答える
25

オブジェクトを使用する場合は、次のことにも興味があるかもしれません。

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

AngularJS 1.1.5 でテスト済み。

于 2013-10-01T09:47:52.837 に答える
4

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

AngularJS のソース コードを見ると、 「!」述語自体ではなく、述語の結果を否定します

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

したがって、これを回避する 1 つの方法は['!'+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>

フィドルの例。

于 2012-11-07T23:05:55.573 に答える
3

メソッド名の前に「!」を付けてフィルタリングする方法を使用している場合 動作しないでしょう。代わりに、次のようなことができます。

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

于 2015-03-16T23:55:41.163 に答える
1

1.3.15 を使用していますが、 ENDOH のソリューションは機能しませんでした。代わりに、filter:'!':languageOrigin私のために働きました。

于 2015-06-12T11:44:44.290 に答える
0

$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>
于 2020-01-21T12:38:50.110 に答える