トランスクルージョンがどのように機能するかは既に知っています (最初のレベル内のみだと思います) が、ネストされたトランスクルージョン項目の範囲について質問があります。
わかりましたので、私はこのコードを持っています:
<body ng-app="docsTabsExample" ng-controller="ctrl">
<my-tabs>
<my-pane title="Hello">
<h4>Hello , The value of "i" is => {{i}}</h4>
</my-pane>
</my-tabs>
</body>
基本的に私は、controller
と<my-tabs>
を持ってい<my-pane >
ます。
myTabs
ディレクティブを見る:
.directive('myTabs', function()
{
return {
restrict: 'E',
transclude: true,
scope:
{},
controller: ['$scope', function($scope)
{
$scope.i = 2;
}],
template: '<div ng-transclude></div>'
};
})
ディレクティブのコンテンツが外側のディレクティブのスコープにアクセスできることを知っています
したがって、黄色の部分は外側のスコープ (メイン コントローラーのスコープ) にアクセスできます。
myPane
ディレクティブのコードは次のとおりです。
.directive('myPane', function()
{
return {
require: '^myTabs',
restrict: 'E',
transclude: true,
scope:
{
},
controller: function($scope)
{
$scope.i = 4; //different value
},
template: '<div ng-transclude></div>'
};
})
プログラムは次のように始まります。
.controller('ctrl', function($scope)
{
$scope.i = 1000;
})
プログラムの出力は次のとおりです。
こんにちは , "i" の値 => 1000
しかし
ドキュメントによると、トランスクルードされたデータは、値を持つディレクティブmyPane's
であるディレクティブの外側のスコープにアクセスできる必要があります。myTabs
i=2
ただし、スコープがmyPane
分離されているため、 からスコープを継承しませんmyTabs
。
質問
それで、取得するためにコントローラーのスコープの1レベル上に移動しますi=1000
か?? (明確化、別の値を取得する方法を尋ねているのではありませんi
-なぜ/どのように値が1000になっているのかを尋ねています)。
つまり、スコープの階層はここでどのように見えるのでしょうか?
こんな感じですか?
controller's scope
|
+--------+---------+
| |
myTabs's mypanes's
transcluded transcluded
data's scope data's scope
ドキュメントは言う:
transclude オプションは、スコープがネストされる方法を変更します。トランスクルードされたディレクティブの内容が、内部にあるスコープではなく、ディレクティブの外側にあるスコープを持つようにします。そうすることで、内容がスコープ外にアクセスできるようになります。
myPAne
しかし、outside ofディレクティブにはどのようなスコープがありますか?
言い換えれば、なぜ/どのようにi=1000
?
回答後に OP から編集
PeriScope (@MarkRajcok から) をインストールして構成した後、視覚的に確認できるようになりました。