2013-04-30 86 views
9

鑑於類似於HTML結構如下:訪問父元素(體)

<body> 
    <div id="one" my-directive></div> 
    <div> 
     <div id="two" my-directive></div> 
    </div> 
</body> 

當我試圖訪問它的工作原理的two父元素和日誌返回父格,但是當父母是身體,如在one的情況下,它不起作用並返回一個空集。

app.directive 'myDirective', -> 
    (scope,iElement,iAttrs) -> 
     console.log iElement.parent() 

編輯:我對這個問題的猜測是,我的應用程序的身體呈現在客戶端和附加到body元素模塊的run方法。插入的html爲$('body').html($compile(body.render())($rootScope));,我猜想在內容插入到主體之前,在$ compile函數中調用該指令。我可以解決這個問題嗎?

+3

似乎按預期方式工作:http://jsfiddle.net/mTNvq/ – Langdon 2013-04-30 17:02:10

+0

這是怪異,現在我有一些可能是問題的線索。 – olanod 2013-04-30 17:31:09

+2

嘗試使用[$ evalAsync](http://docs.angularjs.org/api/ng.$ro​​otScope.Scope#$evalAsync)(在Angular digest循環之後執行,因此在Angular DOM操作之後,但在瀏覽器呈現之前執行)或[ $ timeout](http://docs.angularjs.org/api/ng.$timeout)(在瀏覽器渲染後執行)。 – 2013-04-30 18:32:37

回答

0

事實上,您正確理解您的問題:$compile將觸發您的元素上的模板編譯和鏈接階段,因此它在此過程中沒有父項。

解決這個問題的簡單方法是首先將HTML附加到正文,然後然後編譯它。

var html = body.render(); 
$('body').html(html); 
$compile(angular.element(body))($rootScope); 

或者,如果你不想編譯整個身體,但只是新的元素:

var elem = $(body.render()).appendTo($('body')); 
$compile(elem)($rootScope);