考虑以下指令标记:
<!-- Directive A -->
<directive-a>
</directive-a>
<-- Directive B -->
<directive-b>
<directive-a>
<transclusion1></transclusion1>
</directive-a>
</directive-b>
一旦<directive-a>
已经编译并从<directive-b>
链接,我需要执行一些DOM操作。
当我在<directive-b>
上提供link
函数(或compile
函数)时,<directive-a>
仍然没有其被屏蔽的内容。
一旦<directive-a>
已经编译并链接,我就不知道如何执行DOM操作。
最后,解决方案比我开始实现解决方案时想象的要容易。
假设<directive-a>
具有以下选项:
{
scope: {
"postLink": "&"
}
}
作为controller()
功能的一部分,我做了:
{
controller: () => {
// Angular 1.5.3+
this.$postLink = $scope.postLink;
},
scope: {
"postLink": "&"
}
}
现在我可以挂接到<directive-a>
$postLink
的钩子:
<-- Directive B -->
<directive-b>
<directive-a post-link="model.directiveAPostLink()">
<transclusion1></transclusion1>
</directive-a>
</directive-b>
当调用整个model.directiveAPostLink()
函数时,<directive-a>
已经编译并链接!
更多详细信息
检查Angular GitHub的存储库提交历史,我发现了以下描述:
$postLink
-在此控制器的元素及其子元素之后调用已链接。类似于后链接功能,此挂钩可以用于设置DOM事件处理程序并执行直接DOM操作。请注意,包含
templateUrl
指令的子元素将尚未编译和链接,因为他们正在等待异步加载的模板及其自己的编译和链接已经暂停,直到发生这种情况。
这正是我的情况:我从URL加载模板。