Я уже знаю, как работает включение (думаю, только на первом уровне), но у меня есть вопрос о области действия вложенного включаемого элемента.
Итак, у меня есть этот код:
<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
.
Вопрос
Значит, он поднимается на один уровень еще выше области действия контроллера, чтобы получить i=1000
?? (Пояснение, я не спрашиваю, как заставить i
получить другое значение — я спрашиваю, почему/как оно имеет значение 1000).
Я имею в виду, как здесь выглядит иерархия области видимости?
Это так?
controller's scope
|
+--------+---------+
| |
myTabs's mypanes's
transcluded transcluded
data's scope data's scope
документы говорят:
Опция transclude изменяет способ вложения областей. Это делает так, что содержимое включенной директивы имеет любую область вне директивы, а не ту область, которая находится внутри. При этом он предоставляет содержимому доступ к внешней области.
Но какую область действия имеет директива снаружи myPAne
?
Другими словами, почему/как i=1000
?
ИЗМЕНИТЬ ОТ OP ПОСЛЕ ОТВЕТА
После установки и настройки PeriScope (от @MarkRajcok) я теперь вижу это визуально:
transclude: true
. myPane вложен в myTab. Вы даете myPane область действия myTab, а затем myTab область действия ctrl, что дает myPane область действия ctrl. - person jperezov   schedule 08.12.2015