有一些流行的递归角度指令Q&A,它们都归结为以下解决方案之一:
-
手动递增'compile' HTML基于运行时范围状态
-
根本不使用指令,而是使用引用自身的<script>模板
The first one 有一个问题,除非您可理解地管理手动编译过程,否则无法删除以前编译的代码 . The second approach 的问题是......不是一个指令,错过了它强大的功能,但更紧迫的是,它可以简单地绑定到一个新的控制器实例 .
我一直在玩链接功能中手动执行 angular.bootstrap
或 @compile()
,但这让我遇到了手动跟踪要删除和添加的元素的问题 .
有一种很好的方法可以使用参数化递归模式来管理添加/删除元素以反映运行时状态吗?也就是说,一个带有添加/删除节点按钮的树和一些输入字段,其值从节点的子节点传递下来 . 也许是第二种方法与链式范围的组合(但我不知道如何做到这一点)?
9 回答
受@ dnc253提到的线程中描述的解决方案的启发,我抽象了递归功能into a service .
使用如下:
有关演示,请参阅此Plunker . 我最喜欢这个解决方案,因为:
您不需要特殊的指令来使您的html不那么干净 .
递归逻辑被抽象到RecursionHelper服务中,因此您可以保持指令清洁 .
更新:从Angular 1.5.x开始,不再需要技巧,但仅适用于模板,而不适用于templateUrl
手动添加元素并编译它们绝对是一种完美的方法 . 如果使用ng-repeat,则无需手动删除元素 .
演示:http://jsfiddle.net/KNM4q/113/
我不确定这个解决方案是否在您链接的示例或相同的基本概念中找到,但我需要一个递归指令,我找到a great, easy solution .
您应该创建
recursive
指令,然后将其包装在进行递归调用的元素周围 .从Angular 1.5.x开始,不再需要花样,以下内容已经成为可能 . 不再需要肮脏的工作了!
这个发现是我寻找更好/更清晰的递归指令解决方案的副产品 . 你可以在这里找到https://jsfiddle.net/cattails27/5j5au76c/ . 它支持到1.3.x.
在使用了几个变通方法之后,我一再回到这个问题 .
我对服务解决方案不满意,因为它适用于可以注入服务但不适用于匿名模板片段的指令 .
类似地,通过在指令中执行DOM操作而依赖于特定模板结构的解决方案太具体和脆弱 .
我有一个我认为是通用的解决方案,它将递归封装为自己的指令,它最低限度地干扰任何其他指令,并且可以匿名使用 .
下面是一个演示,你也可以在plnkr玩:http://plnkr.co/edit/MSiwnDFD81HAOXWvQWIM
现在Angular 2.0已经预览了,我认为可以在混合中添加Angular 2.0替代品 . 至少它会让人们以后受益:
关键概念是使用自引用构建递归模板:
然后,将树对象绑定到模板,并观察递归处理其余部分 . 这是一个完整的例子:http://www.syntaxsuccess.com/viewarticle/recursive-treeview-in-angular-2.0
有一个非常简单的解决方法,根本不需要指令 .
那么,从这个意义上说,如果你假设你需要指令,它甚至可能不是原始问题的解决方案,但如果你想要一个带有参数化GUI子结构的递归GUI结构,它就是一个解决方案 . 这可能是你想要的 .
该解决方案仅基于ng-controller,ng-init和ng-include . 只需执行以下操作,假设您的控制器名为“MyController”,您的模板位于myTemplate.html中,并且您的控制器上有一个名为init的初始化函数,它接受参数A,B和C,从而可以参数化您的控制器 . 然后解决方案是如下:
myTemplate.htlm:
我通过简单的巧合发现,这种结构可以按照你喜欢的普通香草角度进行递归 . 只需遵循这种设计模式,您就可以使用递归的UI结构而无需任何高级编译修改等 .
在您的控制器内:
我能看到的唯一缺点是你必须忍受的笨重的语法 .
你可以使用angular-recursion-injector:https://github.com/knyga/angular-recursion-injector
允许您通过调节进行无限深度嵌套 . 仅在需要时重新编译并仅编译正确的元素 . 代码中没有魔力 .
其中一个允许它比其他解决方案更快更简单的工作是“--recursion”后缀 .
我最终创建了一组递归的基本指令 .
IMO它比这里找到的解决方案要基本得多,而且如果不是更灵活,那么我们也不一定要使用UL / LI结构等......但显然这些使用是有意义的,但指令却没有意识到这一点事实...
一个非常简单的例子是:
'dx-start-with' an 'dx-connect'的实现位于:https://github.com/dotJEM/angular-tree
这意味着如果需要8种不同的布局,则不必创建8个指令 .
要在可以添加或删除节点的位置创建树视图,将会非常简单 . 如:http://codepen.io/anon/pen/BjXGbY?editors=1010
从这一点开始,控制器和模板可以包含在它自己的指令中,如果有人愿意的话 .