(他の場所でディレクティブを再利用できるように)分離スコープを持つディレクティブがありng-repeat
、このディレクティブをで使用すると、機能しません。
このトピックに関するすべてのドキュメントとスタックオーバーフローの回答を読み、問題を理解しました。通常の問題をすべて回避できたと思います。
したがって、ng-repeat
ディレクティブによって作成されたスコープが原因でコードが失敗することを理解しています。私自身のディレクティブは、isolateスコープを作成し、親スコープ内のオブジェクトに双方向のデータバインディングを行います。私のディレクティブは、このバインドされた変数に新しいオブジェクト値を割り当てます。これは、私のディレクティブを使用しない場合ng-repeat
(親変数が正しく更新される場合)に完全に機能します。ただし、ng-repeat
では、割り当てによってng-repeat
スコープ内に新しい変数が作成され、親変数には変更が反映されません。これはすべて、私が読んだ内容に基づいて予想どおりです。
また、特定の要素に複数のディレクティブがある場合、1つのスコープのみが作成されることも読みました。そしてpriority
、各ディレクティブにa を設定して、ディレクティブが適用される順序を定義できます。ディレクティブは優先度でソートされてから、それらのコンパイル関数が呼び出されます(http://docs.angularjs.org/guide/directiveで優先度という単語を検索してください)。
したがって、優先順位を使用してディレクティブが最初に実行され、最終的に分離スコープが作成されるようにし、ng-repeat
実行時に親スコープからプロトタイプを継承するスコープを作成する代わりに分離スコープを再利用できることを望んでいました。ng-repeat
ドキュメントは、優先レベルでそのディレクティブの実行と述べています1000
。1
優先度が高いか低いかは不明です。1
ディレクティブで優先度を使用しても違いはないので、試してみました2000
。しかし、それは事態をさらに悪化させます。私の双方向のバインディングがなりundefined
、私のディレクティブは何も表示しません。
私は自分の問題を示すためのフィドルを作成しました。priority
ディレクティブの設定をコメントアウトしました。名前オブジェクトのリストと、名前オブジェクトのname-row
姓名フィールドを表示するという名前のディレクティブがあります。表示された名前をクリックselected
すると、メインスコープに変数を設定して欲しい。名前の配列、selected
変数はname-row
双方向のデータバインディングを使用してディレクティブに渡されます。
メインスコープで関数を呼び出すことでこれを機能させる方法を知っています。また、selected
が別のオブジェクトの内部にあり、外部オブジェクトにバインドすると、問題が発生しないことも知っています。しかし、私は現時点ではそれらの解決策には興味がありません。
代わりに、私が持っている質問は次のとおりです。
- どうやって防ぐか
ng-repeat
親スコープからプロトタイプ的に継承するスコープを作成せずに、ディレクティブの分離スコープを使用するにはですか? - なぜ優先レベルなのか
2000
ディレクティブのしないのですか? - バタランを使用して、どのタイプのスコープが使用されているかを知ることは可能ですか?
ng-repeat
。スタンドアロンディレクティブとを混在させることができると便利ng-repeat
です。続行するには...
ng-repeat
べきではありません。ng-repeat
スコープを持つことは、典型的なユースケースでは意味があるので、変更することはお勧めしません。代わりに、アレックスオズボーンの回答でコメントしたようにng-repeat
、独自のスコープを作成しないで、それに基づいて繰り返しディレクティブを作成すると思います。これは、独自の分離スコープを持つディレクティブの繰り返しに使用できます。続行するには...
ng-repeat
か、カスタムのスコープレスの繰り返しディレクティブを使用するかを知る必要があります。「呼び出し元」がこれを知っていても大丈夫だと思いますが、「呼び出し先」(指示が繰り返されている)がそれが繰り返されているかどうかを知ることは許されていません。続行するには...
scope: true
ため、ディレクティブに使用することをお勧めします。(まだお持ちでない場合)も参照してください。stackoverflow.com/ questions / 14914213 / … また、ディレクティブが複数の場所で使用されるからといって、自動的に分離スコープを使用する必要があるわけではありません。