この質問はかなり古いので、おそらく答えを見つけたでしょうが、他の人が役に立つと思うかもしれないので、私はまだ説明しようとしています.
独立したスコープで作業し、ng-transclude
ディレクティブを使用してコンテンツをトランスクルージョンする場合、覚えておくべき 3 つのことがあります。
- 分離されたスコープは、親のプロパティを継承しないことを意味します。スコープ オブジェクト内で明示的にバインドしたプロパティのみを継承します。
- トランスクルージョンされたコンテンツは、挿入された後にのみコンパイルおよびリンクされます。
ng-transclude
コンテンツをトランスクルージョンするディレクティブの新しい兄弟スコープを作成します。ただし、これはバージョン 1.3.0 から変更される可能性があります。ng -transclude は新しい兄弟スコープを作成しないでください。
例で何が起こっているかを理解する最善の方法は、スコープ ツリーを確認することです。
< Scope (002) : ng-app
< Scope (003) ng-controller
< Scope (004) : b
< Scope (005) : ng-transclude <--- Content rendered under this scope
< Scope (006) : aIsolated
< Scope (007) : b
< Scope (008) : ng-transclude
< Scope (009) : ng-transclude <--- Content rendered under this scope
< Scope (00A) : aNotIsolated
< Scope (00B) : b
< Scope (00C) : ng-transclude
< Scope (00D) : ng-transclude <--- Content rendered under this scope
最初の例では、Angular はb
ディレクティブを見つけます。コンテンツを取り出し、分離されたスコープを作成し、そのテンプレートをコンパイルします。テンプレートをコンパイルすると、ng-transclude
ディレクティブが見つかります。新しい兄弟スコープを作成し、コンテンツを挿入します。ng-transclude
のスコープは兄弟であるため、その親はですng-controller
。したがって、コンテンツはMainCtrl
コントローラーのすべてのプロパティを継承します。
2 番目の例では、Angular がaIsolated
ディレクティブを見つけます。コンテンツを取り出し、分離されたスコープを作成し、そのテンプレートをコンパイルします。テンプレートをコンパイルすると、b
ディレクティブが検出され、コンパイルが開始されb
ます。ディレクティブによってラップされたコンテンツを取り出し、b
分離された子スコープを作成b
し、テンプレートをコンパイルします。b
テンプレートをコンパイルすると、ng-transclude
ディレクティブが見つかります。新しい兄弟スコープを作成し、コンテンツを挿入します。つまり、この新しい兄弟スコープはtransclude
、コンテンツをng-transclude
スコープの子にする関数に渡されます。次に、別のディレクティブが見つかった場所でコンテンツのコンパイルを開始するng-transclude
ため、新しいスコープを作成し、コンテンツを挿入し{{message}}
ます{{private}}
式を入れます。最後に、式をコンパイルしてリンクします。しかし、継承ツリーを見ると、コンテンツがaIsolated
スコープのプロパティを継承していることがわかります。これにより、分離されたスコープになります。
aIsolated
ディレクティブには分離されたスコープがあるため、親スコープで定義されたプロパティにアクセスできないため、コンテンツはコントローラーprivate
で定義したプロパティを読み取ります。aIsolated
次に、ディレクティブb
は分離されたスコープも作成し、それにprivate
プロパティを追加しますが、分離されているため、親のプロパティをオーバーライドしていません。したがって、すべてのディレクティブのコンパイルとリンクが完了すると、ディレクティブで定義されているプロパティがand式aIsolated
に入れられます。プロパティが存在しないため、空です。{{message}}
{{private}}
message
3 番目の例のコンパイル プロセスは、2 番目の例とまったく同じです。aNotIsolated
独自のスコープを作成するだけで、MainCtrl
コントローラーで定義されたプロパティを継承するディレクティブのみが異なります。
ディレクティブのスコープが分離されていない場合、プライベート プロパティは漏れず、挨拶が表示されます。
それは完全に真実ではありません。このように表示される理由はaNotIsolated
、 が独自のprivate
プロパティを定義していないためです。ここで私の例 aNotIsolated
では、コントローラーでプロパティを定義private
しているため、プライベートメッセージが例とは異なることがわかります。
また、何が起こっているのかを説明するのに、漏れは適切な言葉ではありません。式は、挿入先のスコープで評価されます。そのため{{message}}
、 and{{private}}
式はスコープの下で評価され、スコープは,またはスコープng-transclude
のいずれかから継承されます。MainCtrl
aIsolated
aNotIsolated