すばらしい質問ですね。私は思いますが大好き他の人が言っているか聞くために、しかし、ここで私が使用ガイドラインです。
高高度の前提:スコープは、親コントローラー、ディレクティブ、およびディレクティブテンプレート間の通信に使用する「接着剤」として使用されます。
親スコープ: scope: false
なので、新しいスコープはまったくありません
私はこれを頻繁に使用しませんが、@ MarkRajcokが言ったように、ディレクティブがスコープ変数にアクセスしない場合(そして明らかに何も設定しない場合)、これは私が関係している限り問題ありません。これは、唯一の子ディレクティブにも役立ちます。、親ディレクティブのコンテキストで使用され(これには常に例外があります)、テンプレート。基本的に、テンプレートを使用するものはすべて、スコープを共有することに属していません。これは、アクセスと操作のためにそのスコープを本質的に公開しているためです(ただし、このルールには例外があると確信しています)。
例として、私は最近、作成中のSVGライブラリを使用して(静的)ベクターグラフィックを描画するディレクティブを作成しました。これは$observe
2つの属性(width
およびheight
)であり、それらを計算に使用しますが、スコープ変数を設定も読み取りもせず、テンプレートもありません。これは、別のスコープを作成しない場合の良い使用例です。必要ないので、なぜわざわざ?
しかし、別のSVGディレクティブでは、使用するデータのセットが必要であり、さらに小さな状態を保存する必要がありました。この場合、親スコープの使用は無責任です(繰り返しになりますが、一般的に言えば)。代わりに...
子スコープ: scope: true
子スコープを持つディレクティブはコンテキストに対応しており、現在のスコープと対話することを目的としています。
明らかに、これを分離スコープよりも優れている主な利点は、ユーザーが任意の属性に対して自由に補間を使用できることです。たとえばclass="item-type-{{item.type}}"
、分離スコープを持つディレクティブでの使用はデフォルトでは機能しませんが、子スコープを持つディレクティブでは正常に機能します。これは、補間されたものはすべてデフォルトで親スコープに存在するためです。また、ディレクティブ自体は、汚染や親への損傷を心配することなく、独自のスコープのコンテキストで属性と式を安全に評価できます。
たとえば、ツールチップは追加されるだけのものです。ここでは他のディレクティブまたは補間された属性を使用することが予想されるため、分離スコープは機能しません(デフォルトでは、以下を参照)。ツールチップは単なる拡張機能です。しかし、ツールチップは、サブディレクティブやテンプレートで使用するためにスコープにいくつかの設定を行う必要があり、明らかにそれ自体の状態を管理する必要があるため、親スコープを使用するのはかなり悪いでしょう。私たちはそれを汚染しているか、それを損傷しているか、どちらもブエノではありません。
分離スコープや親スコープよりも子スコープをよく使用しています。
スコープを分離: scope: {}
これは再利用可能なコンポーネント用です。:-)
しかし真剣に、私は「再利用可能なコンポーネント」を「自己完結型コンポーネント」と考えています。それらは特定の目的で使用されることを意図しているため、他のディレクティブと組み合わせたり、DOMノードに他の補間された属性を追加したりすることは本質的に意味がありません。
具体的には、このスタンドアロン機能に必要なものは、親スコープのコンテキストで評価される指定された属性を通じて提供されます。これらは、一方向の文字列( '@')、一方向の式( '&')、または双方向の変数バインディング( '=')のいずれかです。
自己完結型コンポーネントでは、それ自体が存在するため、他のディレクティブまたは属性を適用する必要はありません。そのスタイルは独自のテンプレート(必要な場合)によって管理され、適切なコンテンツを変換することができます(必要な場合)。これはスタンドアロンなので、「これをいじる必要はありません。これらのいくつかの属性を通じて定義済みのAPIを提供しています」と言って、分離スコープに入れます。
ディレクティブのリンクとコントローラーの機能からできるだけ多くのテンプレートベースのものを除外することをお勧めします。これは、別の「APIのような」構成ポイントを提供します。ディレクティブのユーザーは、テンプレートを単に置き換えることができます!機能はすべて同じままで、その内部APIは変更されていませんが、必要なだけスタイリングとDOM実装をいじることができます。Peter&Pawelは素晴らしいので、ui / bootstrapはこれをうまく行う方法の良い例です。
分離スコープは、トランスクルージョンでの使用にも最適です。タブを取る; 彼らだけでなく、全体的な機能ですが、あるものは何でも内部の彼らが望むものは何でもするタブ(とペイン)を残したまま、それの親スコープ内から自由に評価することができます。タブには、(テンプレートと対話するための)スコープに属する独自の状態がありますが、その状態は、それが使用されたコンテキストとは関係ありません。これは、タブディレクティブをタブディレクティブにするものの完全に内部的なものです。さらに、タブで他のディレクティブを使用することはあまり意味がありません。それらはタブです-そして私たちはすでにその機能を持っています!
それをより多くの機能で囲むか、より多くの機能を隠蔽しますが、指令はそれがすでにあるものです。
そうは言っても、@ ProLoserが彼の答えで示唆したように、分離スコープのいくつかの制限(つまり機能)を回避する方法があることに注意する必要があります。たとえば、子スコープのセクションでは、分離スコープ(デフォルト)を使用すると、非ディレクティブ属性が壊れる場合の補間について説明しました。しかし、ユーザーは、たとえば、単に使用することができ、class="item-type-{{$parent.item.type}}"
再び機能します。したがって、子スコープよりも分離スコープを使用する説得力のある理由があるが、これらの制限のいくつかが心配な場合は、必要に応じてそれらのほとんどすべてを回避できることを知ってください。
概要
新しいスコープのないディレクティブは読み取り専用です。それらは完全に信頼されており(つまり、アプリの内部)、ジャックには触れません。子スコープを持つディレクティブは機能を追加しますが、それらが唯一の機能ではありません。最後に、分離スコープは、全体的な目標であるディレクティブ用です。それらは独立しているので、それらを不正に行かせても大丈夫です(そしてほとんどの "正しい")。
私は最初の考えを明らかにしたかったのですが、もっと考えたら、これを更新します。しかし、神聖ながらくた-これはSOの答えには長い...
PS:完全に正接ですが、スコープについて話しているので、「プロトタイプ」と言いたいのに対し、他の人は「プロトタイプ」を好んでいます。これはより正確に見えますが、舌から離れているだけです。:-)