Estoy buscando mostrar datos en una estructura de árbol en una aplicación web. Esperaba usar Angular para esta tarea.
Parece que ng-repeat me permitirá recorrer una lista de nodos, pero ¿cómo puedo anidar cuando aumenta la profundidad de un nodo dado?
Intenté el siguiente código , pero el escape automático del HTML impide que esto funcione. Además, la etiqueta ul final está en el lugar equivocado.
Estoy bastante seguro de que me estoy ocupando de este problema completamente por el camino equivocado.
¿Algunas ideas?
Respuestas:
Echa un vistazo a este violín
Original: http://jsfiddle.net/brendanowen/uXbn6/8/
Actualizado: http://jsfiddle.net/animaxf/uXbn6/4779/
Esto debería darle una buena idea de cómo mostrar un
tree like structure
uso angular. Es como usar la recursividad en htmlfuente
Si está utilizando Bootstrap CSS ...
He creado un control de árbol reutilizable simple (directiva) para AngularJS basado en una lista de "navegación" de Bootstrap. Agregué sangría adicional, íconos y animación. Los atributos HTML se utilizan para la configuración.
No usa recursividad.
Lo llamé angular-bootstrap-nav-tree (nombre atractivo, ¿no te parece?)
Hay un ejemplo aquí , y la fuente está aquí .
fuente
Al hacer algo como esto, la mejor solución es una directiva recursiva. Sin embargo, cuando haces una directiva de este tipo, descubres que AngularJS entra en un bucle sin fin.
La solución para esto es dejar que la directiva elimine el elemento durante el evento de compilación y compile manualmente y agréguelos en los eventos de enlace.
Descubrí esto en este hilo y abstraje esta funcionalidad en un servicio .
Con este servicio, puede crear fácilmente una directiva de árbol (u otras directivas recursivas). Aquí hay un ejemplo de una directiva de árbol:
Vea este Plunker para una demostración. Esta solución me gusta más porque:
Actualización: Se agregó soporte para funciones de enlace personalizadas.
fuente
angular-ui-tree parece hacer un buen trabajo para mí
fuente
Aquí hay un ejemplo usando una directiva recursiva: http://jsfiddle.net/n8dPm/ Tomado de https://groups.google.com/forum/#!topic/angular/vswXTes_FtM
fuente
Este parece un poco más completo: https://github.com/dump247/angular.tree
fuente
Otro ejemplo basado en la fuente original , con una estructura de árbol de muestra ya establecida (es más fácil ver cómo funciona IMO) y un filtro para buscar en el árbol:
JSFiddle
fuente
Tantas soluciones geniales, pero creo que todas de una forma u otra complican un poco las cosas.
Quería crear algo que recreara la simplicidad del abanico de @Mark Lagendijk, pero sin definir una plantilla en la directiva, sino que permitiría que el "usuario" creara la plantilla en HTML ...
Con ideas tomadas de https://github.com/stackfull/angular-tree-repeat, etc., terminé creando el proyecto: https://github.com/dotJEM/angular-tree
Lo que te permite construir tu árbol como:
Lo que para mí es más limpio que tener que crear múltiples directivas para árboles estructurados de manera diferente ... En esencia, llamar a lo anterior un árbol es un poco falso, saca mucho más de la "plantilla recursiva" de @ ganaraj, pero nos permite Definir la plantilla donde necesitamos el árbol.
(podría hacerlo con una plantilla basada en la etiqueta del script, pero todavía tiene que estar justo fuera del nodo del árbol real, y todavía se siente un poco asqueroso ...)
Dejado aquí para otra opción ...
fuente
Puede probar con Angular-Tree-DnD sample con Angular-Ui-Tree, pero edité , compatibilidad con tabla, cuadrícula, lista.
fuente
Sobre la base de @ganaraj 's respuesta , y dnc253 @' s respuesta , acabo de hacer un simple 'directiva' de la estructura de árbol que tiene seleccionar, añadir, eliminar y editar función.
Jsfiddle: http://jsfiddle.net/yoshiokatsuneo/9dzsms7y/
HTML:
JavaScript:
fuente
Sí, definitivamente es posible. La pregunta aquí probablemente asume Angular 1.x, pero para referencia futura incluyo un ejemplo de Angular 2:
Conceptualmente, todo lo que tiene que hacer es crear una plantilla recursiva:
Luego vincula un objeto de árbol a la plantilla y deja que Angular haga su magia. Este concepto es obviamente aplicable a Angular 1.x también.
Aquí hay un ejemplo completo: http://www.syntaxsuccess.com/viewarticle/recursive-treeview-in-angular-2.0
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
Cuando la estructura de árbol es grande, Angular (hasta 1.4.x) se vuelve muy lento al representar una plantilla recursiva. Después de probar varias de estas sugerencias, terminé creando una cadena HTML simple y usándola
ng-bind-html
para mostrarla. Por supuesto, esta no es la forma de usar las características angularesAquí se muestra una función recursiva básica (con un mínimo de HTML):
En la plantilla, solo necesita esta línea:
Esto omite todos los enlaces de datos de Angular y simplemente muestra el HTML en una fracción del tiempo de los métodos de plantilla recursiva.
Con una estructura de menú como esta (un árbol de archivos parcial de un sistema de archivos Linux):
La salida se convierte en:
fuente
No complicado.
código del controlador:
fuente