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.

如果有人有更优雅的选择,我很乐意接受!