9

我有一个奇怪的情况。如果我有一个包含 2 个指令的外部指令

inner-directive1 - 定义了一个模板

inner-directive2 - 定义了一个templateUrl

内部指令 1 postLink 函数在外部指令 postLink 函数之前被调用 - 正如预期的那样。

但是,在外部指令 postLink 之后调用了内部指令 poslink 函数 - 与预期不同。

对 postLink 函数的调用是:inner-directive1、outer-directive、inner-directive2,我期待的是:inner-directive1、inner-directive2、outer-directive

外部指令的模板是:

<div ng-transclude><div inner1></div><div inner2></div></div>

请看 JsFiddle

有谁知道原因?有没有办法让它按预期工作?

JSFiddle - 请查看控制台日志。谢谢,本

4

2 回答 2

10

这就是为什么,来自 Angular 指令文档(http://docs.angularjs.org/guide/directive):

templateUrl - 与模板相同,但模板是从指定的 URL 加载的。因为模板加载是异步的,所以编译/链接会暂停,直到加载模板。

因此,该特定指令会停止链接,直到您的模板被加载。在此期间,您的其他指令会加入并运行。

如果链接功能的时机很关键,则需要直接包含模板,而不是作为 templateUrl。除非有人能想出一个很酷的方法来解决这个问题。

于 2013-10-19T22:02:31.773 回答
1

不确定确切的用例,但我在尝试使用 element[0].querySelector('#dynamicId'); 时遇到了这个问题

在这种情况下,这将导致“null”,因为链接函数是在外部链接之后从输入 1 执行的。

修复相当简单,在外部指令的链接函数中,使用 element.ready() 包装代码:

element.ready(function(){
     var item = element[0].querySelector('#dynamicId');
     item.bind('blur', function(){
         alert('blur')
     });
})

这使我能够找到动态元素并附加任何事件,即使它是从模板 url 异步加载的。

于 2014-11-11T00:22:26.710 回答