10

Angular では、完全一致のみを返すようにフィルターを変更する方法はありますか?

例:

var words = [
    {   title: "ball"   },
    {   title: "wall"   },
    {   title: "all"    },
    {   title: "alloy"  }
];

var wordsFiltered = filter('filter')
( 
    words, 
    { 
        'title': 'all'
    } 
);  

上記は「ball」、「wall」、「all」、および「alloy」に一致します。しかし、「すべて」にのみ一致するようにしたいと思います。変更する方法はありますか?

4

6 に答える 6

19

アップデート

AngularJS v.1.1.3 以降では、正確なフィルタリングがネイティブで提供されます

Find words that exactly match title: 
<input ng-model="match.title" />
<br>
and exactly match type: 
<input ng-model="match.type" />
<hr>
<table>
  <tr ng-repeat="word in words | filter:match:true">
   <td>{{word.title}}</td> 
  </tr>
</table>

Plunker


あなたの質問は、複数のオブジェクト プロパティに対して照合することを意味するため、それを行うフィルターを次に示します。

app.controller('AppController',
    [
      '$scope',
      function($scope) {
        $scope.match = {};
        $scope.words = [
          { title: "ball", type: 'object' },
          { title: "wall", type: 'object' },
          { title: "all", type: 'word' },
          { title: "alloy", type: 'material' }
        ];
        
      }
    ]
  );
  
app.filter('exact', function(){
  return function(items, match){
    var matching = [], matches, falsely = true;
    
    // Return the items unchanged if all filtering attributes are falsy
    angular.forEach(match, function(value, key){
      falsely = falsely && !value;
    });
    if(falsely){
      return items;
    }
    
    angular.forEach(items, function(item){ // e.g. { title: "ball" }
      matches = true;
      angular.forEach(match, function(value, key){ // e.g. 'all', 'title'
        if(!!value){ // do not compare if value is empty
          matches = matches && (item[key] === value);  
        }
      });
      if(matches){
        matching.push(item);  
      }
    });
    return matching;
  }
});
<body ng-controller="AppController">

  Find words that exactly match title: 
  <input ng-model="match.title" />
  <br>
  and exactly match type: 
  <input ng-model="match.type" />
  <hr>
  <table>
    <tr ng-repeat="word in words | exact:match">
     <td>{{word.title}}</td> 
    </tr>
  </table>  
</body>

PLUNKER

于 2013-08-14T22:08:06.917 に答える
9

これを試して :

var words = [
    {   title: "ball"   },
    {   title: "wall"   },
    {   title: "all"    },
    {   title: "alloy"  }
];

var wordsFiltered = filter('filter')
( 
    words, 
    { 
        'title': 'all'
    },
    true
);
于 2014-10-22T13:11:57.773 に答える
3

Regex を使用して簡単な実装を実現できます。

<input ng-model="query" />
<tr ng-repeat="word in words | filter: myFilter">

コントローラーで:

$scope.myFilter = function (word) {
    if ($scope.query === '') return true;
    var reg = RegExp("^" + $scope.query + "$");
    return reg.test(word.title);
};
于 2013-08-14T23:00:07.017 に答える
2

新しいフィルターを作成します。これは、あなたの望むことですか?

HTML

<div ng-controller="MyCtrl">
     {{words | exactMatch:'all'}} !
</div>

JavaScript

var myApp = angular.module('myApp',[]);

myApp.filter('exactMatch', function() {
    return function(words, pattern) {
        var result = [];
        words.forEach(function (word) {
            if (word.title === pattern) {
                result.push(word);
            }
        });                
        return result;
    }
});

function MyCtrl($scope) {
    $scope.words = [
        {title: "ball", other: 1},
        {title: "wall", other: 2},
        {title: "all", other: 3},
        {title: "alloy", other: 4},
        {title: "all", other: 5},
    ];
}

JsFiddle: jsfiddle
カスタム フィルターの詳細:フィルターカスタム フィルターの作成、およびフィルターの使用

html の代わりに Javascript でフィルターを使用する場合は、ここを参照してください: jsfiddle

于 2013-08-14T21:43:41.027 に答える