Angular 编译阶段指令通信
Angular directive communication in compile phase
我有两个指令,一个 parent 和一个 child,我想要一种从 parent 到 child 获取信息的方法,这样child 在其 编译 阶段拥有该信息。
具体来说,我有 "tree" (parent) 和 "tree node" (child) 指令,我想修改树节点的模板 (child) 基于附加到树本身的属性 (parent).
任何感兴趣的人,您可以在 GitHub 上查看代码:
我还要指出树节点本身实际上是 deferring it's compilation until post link,所以也许这打开了一些大门。
我想避免在节点中进行任何 dom 遍历(即递归检查 parent 元素以在树指令中查找属性)。另外,请记住,页面上可能有多个树指令,它们可能需要稍后动态创建新节点,所以我认为我真的无法摆脱例如暂时将信息闪烁到服务。
在 compile
阶段,或 pre-link
阶段(按降序进行,与通常的 post-link
阶段相反),您的 child指令将只知道它自己的模板,这意味着您无法避免寻找 parent 树元素。
但是,您可以在 pre-link
阶段为 parent 树范围设置一些属性,并允许 child 节点指令(pre 或 post link, child).
无所谓
例如在树中:
compile: function() {
return {
pre: function(scope, elem) {
scope.something = doSomethingWith(elem);
}
};
}
你传递给你的树节点:
<tree-node tree-data="something"></tree-node>
(仅当作用域被隔离时,否则可立即访问)
经过一些搜索,我没有找到一种惯用的方法来完成我所追求的。我最终利用我们(已经)修改过的编译过程解决了这个问题。
基本上这个想法是:
- 在编译阶段完全删除 child 元素的内容。在我们的例子中,这用于打破原本无限递归的编译过程,并推迟编译,直到我们可以获得对 parent 控制器的引用以帮助我们修改 child 的模板。
- child 的
postLink
函数获取了对 parent 控制器的引用。使用控制器从 parent 指令获取信息并为 child 构建一个新模板。编译此模板并将其附加到 child.
如果有人有更优雅的选择,我很乐意接受!
我有两个指令,一个 parent 和一个 child,我想要一种从 parent 到 child 获取信息的方法,这样child 在其 编译 阶段拥有该信息。
具体来说,我有 "tree" (parent) 和 "tree node" (child) 指令,我想修改树节点的模板 (child) 基于附加到树本身的属性 (parent).
任何感兴趣的人,您可以在 GitHub 上查看代码:
我还要指出树节点本身实际上是 deferring it's compilation until post link,所以也许这打开了一些大门。
我想避免在节点中进行任何 dom 遍历(即递归检查 parent 元素以在树指令中查找属性)。另外,请记住,页面上可能有多个树指令,它们可能需要稍后动态创建新节点,所以我认为我真的无法摆脱例如暂时将信息闪烁到服务。
在 compile
阶段,或 pre-link
阶段(按降序进行,与通常的 post-link
阶段相反),您的 child指令将只知道它自己的模板,这意味着您无法避免寻找 parent 树元素。
但是,您可以在 pre-link
阶段为 parent 树范围设置一些属性,并允许 child 节点指令(pre 或 post link, child).
例如在树中:
compile: function() {
return {
pre: function(scope, elem) {
scope.something = doSomethingWith(elem);
}
};
}
你传递给你的树节点:
<tree-node tree-data="something"></tree-node>
(仅当作用域被隔离时,否则可立即访问)
经过一些搜索,我没有找到一种惯用的方法来完成我所追求的。我最终利用我们(已经)修改过的编译过程解决了这个问题。
基本上这个想法是:
- 在编译阶段完全删除 child 元素的内容。在我们的例子中,这用于打破原本无限递归的编译过程,并推迟编译,直到我们可以获得对 parent 控制器的引用以帮助我们修改 child 的模板。
- child 的
postLink
函数获取了对 parent 控制器的引用。使用控制器从 parent 指令获取信息并为 child 构建一个新模板。编译此模板并将其附加到 child.
如果有人有更优雅的选择,我很乐意接受!