So già come funziona la transclusione (solo nel primo livello credo), ma ho una domanda sull'ambito dell'elemento nidificato escluso.Nidificato - elementi esclusi - chiarimento dell'ambito?
Ok quindi non ho questo codice:
<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>
Fondamentalmente ho un controller
, <my-tabs>
e <my-pane >
.
Guardando myTabs
direttiva:
.directive('myTabs', function()
{
return {
restrict: 'E',
transclude: true,
scope:
{},
controller: ['$scope', function($scope)
{
$scope.i = 2;
}],
template: '<div ng-transclude></div>'
};
})
So che il contenuto della direttiva avrà accesso al campo di applicazione esterna della direttiva
Quindi la parte gialla avrà accesso al esterno scope (che è l'ambito del controller principale):
Qui è il codice per myPane
direttiva:
.directive('myPane', function()
{
return {
require: '^myTabs',
restrict: 'E',
transclude: true,
scope:
{
},
controller: function($scope)
{
$scope.i = 4; //different value
},
template: '<div ng-transclude></div>'
};
})
Il programma inizia con:
.controller('ctrl', function($scope)
{
$scope.i = 1000;
})
L'output del programma è:
Ciao, Il valore di "i "è => 1000
Ma
Secondo la documentazione: myPane's
dati transclusa dovrebbero avere accesso al campo di applicazione esterna della direttiva, che è myTabs
direttiva che ha il valore i=2
.
Ma myPane
ha un isolato ambito così fa NON ereditano il campo da myTabs
.
Domanda
così essa va un livello più superiore alla portata del controller al fine di ottenere i=1000
?? (Chiarimento, non sto chiedendo come posso fare in modo che i
ottenga un altro valore - sto chiedendo perché/come ha il valore di 1000).
Voglio dire come appare la gerarchia di scopo qui?
È così?
controller's scope
|
+--------+---------+
| |
myTabs's mypanes's
transcluded transcluded
data's scope data's scope
la documentazione dice:
L'opzione transclude cambia il modo in ambiti sono annidati. Lo rende in modo che il contenuto di una direttiva transclusa abbia qualsiasi ambito sia al di fuori della direttiva, piuttosto che qualsiasi ambito è all'interno. In così facendo, dà ai contenuti l'accesso all'ambito esterno.
Ma quale ambito ha l'esterno della direttiva myPAne
?
In altre parole, perché/come fa i=1000
?
EDIT FROM OP dopo la risposta
volta installato e configurato Periscope (da @MarkRajcok) posso ora vedere visivamente:
Sia mytab e myPane hanno 'transclude: true'. myPane è annidato all'interno di myTab. Stai dando a myPane l'ambito di myTab e poi myTab l'ambito di ctrl, che dà a myPane l'ambito di ctrl. – jperezov