编译阶段的角度指令通信

时间:2015-04-16 21:23:24

标签: javascript angularjs angularjs-directive treeview

我有两个指令,一个父母和一个孩子,我想要一种从父母那里获取信息的方式,以便孩子在编译阶段获得该信息。

具体来说,我有"树" (父)和"树节点" (子)指令,我想根据附加到树本身(父)的属性修改树节点(子)的模板。

对于任何有兴趣的人,您都可以在GitHub上看到代码:

我还要指出树节点本身实际上是deferring it's compilation until post link,所以也许会打开一些门。

我想避免在节点中进行任何dom遍历(即递归检查父元素以在树指令上查找属性)。此外,请记住,页面上可能有多个树指令,他们可能需要稍后动态创建新节点,所以我不认为我可以真正逃脱,例如暂时将信息闪烁到服务中。

2 个答案:

答案 0 :(得分:0)

compile阶段,或pre-link阶段(按降序完成,与通常的post-link阶段相反),您的子指令只会知道它自己的模板,这意味着你无法避免寻找父树元素。

但是,您可以在pre-link阶段为父树范围设置一些属性,并将它们访问到您的子节点指令(前置链接或后置链接,对子节点无关紧要)。

例如在Tree:

compile: function() {
  return {
    pre: function(scope, elem) {
      scope.something = doSomethingWith(elem);
    }
  };
}

你传递给你的treenode:

 <tree-node tree-data="something"></tree-node>

(仅当范围被隔离时,否则可以立即访问)

答案 1 :(得分:0)

经过一番搜索后,我没有找到一种惯用的方法来完成我追求的目标。我最终解决了利用我们(已经)修改过的编译过程的问题。

基本上这个想法是:

  • 在编译阶段完全删除子元素的内容。在我们的例子中,这可以打破一个无限递归的编译过程,也可以推迟编译,直到我们可以获得对父控制器的引用来帮助我们修改子模板。
  • 孩子的postLink函数get传递了对父控制器的引用。使用控制器从父指令获取信息并为子项构建新模板。编译此模板并将其附加到孩子身上。

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