2013-06-19 8 views
15

sublistディレクティブをページのいくつかの場所で使用する必要があり、完全なfieldsリストを含む必要があります。ここに私の単純なアプローチです:Angular.jsフィルタを双方向( '=')の属性に渡します

HTML:

<div ng-controller="MainCtrl"> 
     <sublist fields="fields" /> <!-- This one is OK --> 
     <sublist fields="fields | filter: 'Rumba'" /> <!-- This one raises error --> 
    </div> 

Javascriptを:

angular.module('myApp', []) 
    .directive('sublist', function() { 
     return { 
      restrict: 'E', 
      scope: { fields: '=' }, 
      template: '<div ng-repeat="f in fields">{{f}}</div>' 
     }; 
    }) 
    .controller('MainCtrl', function($scope) { 
     $scope.fields = ['Samba', 'Rumba', 'Cha cha cha']; 
    }); 

http://jsfiddle.net/GDfxd/14/

私はこのエラーを取得していますフィルタを使用しようとすると:

Error: 10 $digest() iterations reached. Aborting! 

この問題の解決策はありますか?

答えて

24

$ digest iterations通常、モデルを変更するウォッチャーがあるとエラーが発生します。エラーの場合、分離体fieldsバインディングはフィルタの結果にバインドされます。そのバインディングはウォッチャーを作成します。フィルタは、実行するたびに関数呼び出しから新しいオブジェクトを返しますので、古い値が新しい値と決して一致しないため、ウォッチャは引き続きトリガします(this comment from Igor in Google Groups参照)。

<sublist fields="fields" /></sublist> 

とフィルタリングのための第二の場合には、別のオプションの属性を追加します:

良い修正は次のように両方のケースでfieldsをバインドすることです

<sublist fields="fields" filter-by="'Rumba'" /></sublist> 

はその後のようなあなたのディレクティブを調整します

return { 
    restrict: 'E', 
    scope: { 
     fields: '=', 
     filterBy: '=' 
    }, 
    template: '<div ng-repeat="f in fields | filter:filterBy">'+ 
       '<small>here i am:</small> {{f}}</div>' 
}; 

注:sublistのタグを必ず閉じてください。あなたのフィドル。

Here is a fiddle

+0

+1説明と参考のためです。 –

+0

複数のフィルタや並べ替えなどが必要な場合はどうすればよいですか?ディレクティブにフィルタリング/ソートされたリストを渡す一般的な解決法はありますか? –

+0

@EugeneOsovetsky:その時点で '$ filter'を注入することで、指示リンク/コントローラ機能の重い作業をやるのがより簡単で必要です。 (つまり、このQ&Aコンテキストは、MVCパラダイムのコントローラ部分ではなく、ビューです。コントローラは、より複雑にすることができます)。[stackoverflow.com/a/14302334/2185093](http://stackoverflow.com/a)/14302334/2185093)詳細情報 – sh0ber

1

Corrected Fiddle

関連のポストhereを確認してください。

フィディードでは、終了タグが必要です。 あなたはあなたが持っているもののような自己完結型タグを依然として持つことができます。

<sublist fields="fields" filter="'Rumba'"/> <!-- Tested in chrome --> 
+0

コントローラのスコープに 'filtered'データを置くこともできます。そのためにはあなたのコントローラに '' $ filter 'service'を注入する必要があります。含まれている参照はこれを示す。 –

+0

あなたはcommnetsで情報を追加するのではなく、あなたの答えを編集して更新することができます.... –

関連する問題