2014-01-19 33 views
-1

我下载了一个叫做abn_tree的角度指令来建立一个角度的文件系统视图。嵌套的角度指令没有得到正确的范围

abn_tree嵌套在另一个指令中。 其中包含指示我的模板结构看起来像这样

<div class=resizable-sideways" ng-controller="FileSystem"> 
    <abn-tree tree-data="explorer" on-select="treeSelected(branch)"></abn-tree> 
</div> 

在初始DIV,resizable-sideways是一个指令。 在我的FileSystem控制器中,我设置了资源管理器,但是当我查看abn-tree的范围时,在控制台中,它说treeData=undefined

的abn_tree定义是,

restrict: 'E', 
templateUrl: 'vendor/angular-bootstrap-nav-tree/dist/abn_tree_template.html', 
scope: { 
    treeData: '=', 
    onSelect: '&', 
    initialSelection: '=' 
}, 
link: function(scope, element, attrs) { 

不过,如果我更改HTML结构和删除resizable-sideways指令,一切工作正常。

我限定可调整大小-侧身作为

return { 
     restrict: 'CA', 
     transclude: true, 
     template: '<div class="favor-resizable-container"><div class="favor-resizable-container-wrapper" ng-transclude></div><div class="favor-resizable-bar"></div></div>', 
     link: function(scope,elem,attrs){ 

我使用可调整大小-侧身在一个可调整大小的div来包装内容。我的猜测是,当abn-tree标签被封装时,abn-tree的范围被设置为可调整大小。 有没有办法确保可调整大小的副本始终将其父级范围传递给子元素,直到定义新范围为止?

它似乎过于复杂,但我试图创建一个非常模块化的应用程序,用户可以决定他们想要包括哪些功能,因此,我不能绝对确定地说,父范围应该是什么。所以希望有一种方法可以将可调整大小设置为不具有范围,继承它的父范围(我认为是默认范围)或其他解决方案。

奇怪的是,将ng-controller直接添加到abn-tree标签也没有帮助。

+0

什么版本的角度您使用的是

myApp.directive("resizable",function() { return { restrict: 'CA', link: function(scope,elem,attrs){ elem.wrap('<div class="favor-resizable-container-wrapper"></div>'); elem.append('<div class="favor-resizable-bar"></div>'); elem.wrap('<div class="favor-resizable-container"></div>'); .... } 

这里的?在1.2之前? (如果它是1.2之前的版本,是换一个更新版本的选项?) – KayakDave

+0

我在1.2.5上,所以不应该是个问题。 – pedalpete

回答

0

Transclude改变了transcluded元素看到的范围。 Angular guide to directives

transclude选项更改了作用域嵌套的方式。它使得它 ,这样一个transcluded指令的内容的任何范围是指令外的 ,而不是内部内的任何范围。在 这样做时,它将内容访问到外部范围。

你可以看到这是如何发挥in this fiddle。您会看到可调整大小的范围为3,父级范围为2.虽然abn的范围为5,父级4,父级为2.关键是abn没有范围3,ngController在其继承链中。这是因为跨越范围具有“无论范围是否在指令之外” 。

一种解决方案是让ngController父母双方:

​​

,或者你并不真正需要transclude为你在做什么。相反,你可以使用jQlite wrapappend的元素进行修改是这样的(从而避免transclude范围的问题):一个fiddle with that mocked up