2013-04-30 85 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);