Hay un par de preguntas y respuestas populares sobre la directiva angular recursiva, que se reducen a una de las siguientes soluciones:
- 'compilar' HTML incrementalmente manualmente basado en el estado del alcance del tiempo de ejecución
- no use una directiva, sino una plantilla <script> que se refiera a sí misma
El primero tiene el problema de que no puede eliminar el código compilado previamente a menos que gestione de manera comprensible el proceso de compilación manual. El segundo enfoque tiene el problema de ... no ser una directiva y perder sus poderosas capacidades, pero más urgentemente, no se puede parametrizar de la misma manera que una directiva; simplemente está vinculado a una nueva instancia de controlador.
He estado jugando manualmente haciendo una angular.bootstrap
o @compile()
en la función de enlace, pero eso me deja con el problema de realizar un seguimiento manual de los elementos para eliminar y agregar.
¿Hay una buena manera de tener un patrón recursivo parametrizado que gestione agregar / eliminar elementos para reflejar el estado de tiempo de ejecución? Es decir, un árbol con un botón de agregar / eliminar nodo y algún campo de entrada cuyo valor se transmite por los nodos secundarios de un nodo. ¿Quizás una combinación del segundo enfoque con ámbitos encadenados (pero no tengo idea de cómo hacerlo)?
fuente
compile: function(element) { return RecursionHelper.compile(element); }
concompile: RecursionHelper.compile
.Agregar elementos y compilarlos manualmente es definitivamente un enfoque perfecto. Si usa ng-repeat entonces no tendrá que eliminar elementos manualmente.
Demostración: http://jsfiddle.net/KNM4q/113/
fuente
No estoy seguro si esta solución se encuentra en uno de los ejemplos que vinculó o en el mismo concepto básico, pero necesitaba una directiva recursiva y encontré una solución excelente y fácil .
Debe crear la
recursive
directiva y luego envolverla alrededor del elemento que realiza la llamada recursiva.fuente
[$compile:multidir] Multiple directives [tree, tree] asking for new/isolated scope on: <recursive tree="tree">
compiledContents(scope,function(clone) { iElement.append(clone); });
contrario, el controlador "requerido" no se maneja correctamente y error:Error: [$compile:ctreq] Controller 'tree', required by directive 'subTreeDirective', can't be found!
causa.A partir de Angular 1.5.x, no se requieren más trucos, lo siguiente ha sido posible. ¡No más necesidad de trabajar sucio!
Este descubrimiento fue un subproducto de mi búsqueda de una solución mejor / más limpia para una directiva recursiva. Puede encontrarlo aquí https://jsfiddle.net/cattails27/5j5au76c/ . Es compatible hasta ahora es 1.3.x.
fuente
Después de usar varias soluciones por un tiempo, he vuelto repetidamente a este problema.
La solución de servicio no me satisface, ya que funciona para directivas que pueden inyectar el servicio pero no funciona para fragmentos de plantilla anónimos.
Del mismo modo, las soluciones que dependen de una estructura de plantilla específica mediante la manipulación de DOM en la directiva son demasiado específicas y frágiles.
Tengo lo que creo que es una solución genérica que encapsula la recursividad como una directiva propia que interfiere mínimamente con cualquier otra directiva y puede usarse de forma anónima.
A continuación se muestra una demostración con la que también puede jugar en plnkr: http://plnkr.co/edit/MSiwnDFD81HAOXWvQWIM
fuente
Ahora que Angular 2.0 está en vista previa, creo que está bien agregar una alternativa Angular 2.0 a la mezcla. Al menos beneficiará a las personas más tarde:
El concepto clave es construir una plantilla recursiva con una referencia propia:
Luego vincula un objeto de árbol a la plantilla y observa cómo la recursión se encarga del resto. Aquí hay un ejemplo completo: http://www.syntaxsuccess.com/viewarticle/recursive-treeview-in-angular-2.0
fuente
Hay una solución muy simple para esto que no requiere directivas en absoluto.
Bueno, en ese sentido, tal vez ni siquiera sea una solución del problema original si supone que necesita directivas, pero ES una solución si desea una estructura de GUI recursiva con subestructuras parametrizadas de la GUI. Que es probablemente lo que quieres.
La solución se basa simplemente en usar ng-controller, ng-init y ng-include. Simplemente hágalo de la siguiente manera, suponga que su controlador se llama "MyController", su plantilla se encuentra en myTemplate.html y que tiene una función de inicialización en su controlador llamada init que toma los argumentos A, B y C, lo que hace posible parametrice su controlador. Entonces la solución es la siguiente:
myTemplate.htlm:
Descubrí por simple coincidencia que este tipo de estructura se puede hacer recursiva como se desee en angular simple. Simplemente siga este patrón de diseño y puede usar estructuras de interfaz de usuario recursivas sin ningún retoque de compilación avanzado, etc.
Dentro de su controlador:
El único inconveniente que puedo ver es la sintaxis torpe que tienes que soportar.
fuente
Puede usar el inyector de recursión angular para eso: https://github.com/knyga/angular-recursion-injector
Le permite anidar en profundidad ilimitada con acondicionamiento. Recompila solo si es necesario y solo compila los elementos correctos. No hay magia en el código.
Una de las cosas que le permite trabajar más rápido y más simple que las otras soluciones es el sufijo "--recursion".
fuente
Terminé creando un conjunto de directivas básicas para la recursión.
OMI Es mucho más básico que la solución que se encuentra aquí, e igual de flexible si no más, por lo que no estamos obligados a usar estructuras UL / LI, etc. Pero, obviamente, tiene sentido usarlas, sin embargo, las directivas no son conscientes de esto. hecho...
Un ejemplo súper simple sería:
La implementación de 'dx-start-with' an 'dx-connect' se encuentra en: https://github.com/dotJEM/angular-tree
Esto significa que no tiene que crear 8 directivas si necesita 8 diseños diferentes.
Crear una vista de árbol además de eso donde puede agregar o eliminar nodos sería bastante simple. Como en: http://codepen.io/anon/pen/BjXGbY?editors=1010
A partir de este momento, el controlador y la plantilla podrían incluirse en su propia directiva si se desea.
fuente