2014-01-19 70 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