94

基本的に、式に一致する場合、ng-repeat の項目をスキップするように angular に指示する方法を探していcontinueます。

コントローラーで:

$scope.players = [{
    name_key:'FirstPerson', first_name:'First', last_name:'Person'
}, {
    name_key:'SecondPerson', first_name:'Second', last_name:'Person'
}]

今、私のテンプレートで、一致しないすべての人を表示したいと思いname_key='FirstPerson'ます。私はそれがフィルターでなければならないと考えたので、それをいじるためにPlunkrをセットアップしましたが、運がありませんでした. プランカーの試み

4

3 に答える 3

145

@Maxim Shoustinが示唆したように、目的を達成するための最良の方法は、カスタム フィルターを使用することです。
しかし、他の方法があります。そのうちの 1 つは、ng-ifディレクティブを配置した同じ要素でディレクティブを使用することですng-repeat(また、ここにplunkerがあります)。

<ul>
    <li ng-repeat="player in players" ng-if="player.name_key!='FirstPerson'"></li>
</ul>

playersこれは、審美的な観点からは小さな欠点をもたらす可能性がありますが、配列と密接に結合されておらず、アプリのスコープ内の他のデータに簡単にアクセスできる ルールに基づいてフィルタリングできるという大きな利点があります。

  <li 
      ng-repeat="player in players" 
      ng-if="app.loggedIn && player.name != user.name"
  ></li>

更新
前述のとおり、これはこの種の問題に対する解決策の 1 つであり、ニーズに合う場合と合わない場合があります。
コメントで指摘されているように、ng-ifはディレクティブです。これは実際には、バックグラウンドで予想以上のことを行う可能性があることを意味します。
たとえば、そのng-if 親から新しいスコープを作成します

ngIf 内で作成されたスコープは、プロトタイプ継承を使用して親スコープから継承します。

これは通常、通常の動作には影響しませんが、予期しないケースを防ぐために、実装する前にこれを念頭に置く必要があります。

于 2013-11-05T07:48:00.667 に答える
44

これが古いものであることは知っていますが、誰かが別の可能な解決策を探す場合に備えて、これを解決する別の方法があります-標準のフィルター機能を使用します:

オブジェクト:パターン オブジェクトを使用して、配列に含まれるオブジェクトの特定のプロパティをフィルター処理できます。たとえば、{name:"M", phone:"1"} 述語は、"M" を含むプロパティ name と "1" を含むプロパティ phone を持つアイテムの配列を返します。...述語は、文字列の前に ! を付けることで否定できます。たとえば、{name: "!M"} 述語は、"M" を含まないプロパティ名を持つ項目の配列を返します。

したがって、TS の例では、次のようにする必要があります。

<ul>
    <li ng-repeat="player in players | filter: { name_key: '!FirstPerson' }"></li>
</ul>

カスタム フィルターを作成する必要はなく、ng-if新しいスコープで使用する必要もありません。

于 2015-07-09T12:15:50.857 に答える
19

実装時にカスタムフィルターを使用できますng-repeat。何かのようなもの:

 data-ng-repeat="player in players |  myfilter:search.name

myfilter.js:

app.filter('myfilter', function() {


   return function( items, name) {
    var filtered = [];

    angular.forEach(items, function(item) {

      if(name == undefined || name == ''){
        filtered.push(item);
        }

      /* only if you want start With*/
      // else if(item.name_key.substring(0, name.length) !== name){
      //   filtered.push(item);
      // }

      /* if you want contains*/
      // else if(item.name_key.indexOf(name) < 0 ){
      //   filtered.push(item);
      // }

       /* if you want match full name*/
       else if(item.name_key !== name ){
        filtered.push(item);
      }
    });

    return filtered;
  };
});

デモPlunker

于 2013-11-05T07:40:09.010 に答える