【发布时间】:2016-03-13 18:23:48
【问题描述】:
我已经知道嵌入是如何工作的(我猜只是在第一级),但是我对嵌套嵌入项的范围有疑问。
好的,我有这个代码:
<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>'
};
})
我知道指令的内容可以访问outer指令的作用域
所以黄色部分将可以访问外部范围(即主控制器范围):
这是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)后,我现在可以直观地看到它:
【问题讨论】:
-
myTab 和 myPane 都有
transclude: true。 myPane 嵌套在 myTab 中。您给 myPane 提供了 myTab 的范围,然后给 myTab 提供了 ctrl 的范围,这为 myPane 提供了 ctrl 的范围。
标签: angularjs angularjs-ng-transclude