Estou procurando exibir dados em uma estrutura de árvore em um aplicativo da web. Eu esperava usar o Angular para esta tarefa.
Parece que ng-repeat me permitirá percorrer uma lista de nós, mas como posso aninhar quando a profundidade de um determinado nó aumenta?
Eu tentei o código a seguir , mas o escape automático do HTML está impedindo que isso funcione. Além disso, a tag final ul está no lugar errado.
Tenho certeza de que estou lidando com esse problema de maneira totalmente errada.
Alguma ideia?
Respostas:
Dê uma olhada neste violino
Original: http://jsfiddle.net/brendanowen/uXbn6/8/
Atualizado: http://jsfiddle.net/animaxf/uXbn6/4779/
Isso deve lhe dar uma boa idéia de como exibir um
tree like structure
angular de uso. É como usar recursão em html!fonte
Se você estiver usando o Bootstrap CSS ...
Eu criei um controle de árvore reutilizável simples (diretiva) para o AngularJS com base em uma lista "nav" do Bootstrap. Eu adicionei recuo extra, ícones e animação. Atributos HTML são usados para configuração.
Não usa recursão.
Eu chamei de angular-bootstrap-nav-tree (nome cativante, você não acha?)
Há um exemplo aqui e a fonte está aqui .
fonte
Ao fazer algo assim, a melhor solução é uma diretiva recursiva. No entanto, quando você faz essa diretiva, descobre que o AngularJS entra em um loop infinito.
A solução para isso é permitir que a diretiva remova o elemento durante o evento de compilação, compile e adicione manualmente nos eventos de link.
Eu descobri sobre isso neste tópico e abstraí essa funcionalidade em um serviço .
Com este serviço, você pode facilmente criar uma diretiva de árvore (ou outras diretivas recursivas). Aqui está um exemplo de uma diretiva de árvore:
Veja este Plunker para uma demonstração. Eu gosto mais desta solução porque:
Atualização: Adicionado suporte para funções de vinculação personalizadas.
fonte
angular-ui-tree parece fazer um bom trabalho para mim
fonte
Aqui está um exemplo usando uma diretiva recursiva: http://jsfiddle.net/n8dPm/ Retirado de https://groups.google.com/forum/#!topic/angular/vswXTes_FtM
fonte
Este parece um pouco mais completo: https://github.com/dump247/angular.tree
fonte
Outro exemplo baseado na fonte original , com uma estrutura de árvore de amostra já em vigor (mais fácil de ver como funciona o IMO) e um filtro para pesquisar na árvore:
JSFiddle
fonte
Tantas ótimas soluções, mas acho que todas elas, de uma forma ou de outra, complicam um pouco as coisas.
Eu queria criar algo que recriasse a simplicidade do awnser de @Mark Lagendijk, mas sem definir um modelo na diretiva, mas permitiria que o "usuário" criasse o modelo em HTML ...
Com idéias tiradas de https://github.com/stackfull/angular-tree-repeat etc ... acabei criando o projeto: https://github.com/dotJEM/angular-tree
O que permite que você construa sua árvore como:
O que, para mim, é mais limpo do que ter que criar várias diretivas para árvores de estrutura diferente ... Em essência, chamar a árvore acima é um pouco falsa, ela tira muito mais proveito do awnser de "modelos recursivos" do @ ganaraj, mas nos permite defina o modelo em que precisamos da árvore.
(você pode fazer isso com um modelo baseado em tag de script, mas ele ainda precisa ficar do lado de fora do nó da árvore real e ainda parece um pouco estranho ...)
Deixou aqui apenas mais uma opção ...
fonte
Você pode tentar com o exemplo Angular-Tree-DnD com Angular-Ui-Tree, mas editei, compatibilidade com tabela, grade, lista.
fonte
Baseado em @ganaraj 's resposta , e @ dnc253' s resposta , eu fiz apenas um simples 'directiva' para a estrutura da árvore ter selecionar, adicionar, excluir e editar recurso.
Jsfiddle: http://jsfiddle.net/yoshiokatsuneo/9dzsms7y/
HTML:
JavaScript:
fonte
Sim, definitivamente possível. A pergunta aqui provavelmente assume o Angular 1.x, mas para referência futura, incluí um exemplo do Angular 2:
Conceitualmente, tudo o que você precisa fazer é criar um modelo recursivo:
Em seguida, você vincula um objeto de árvore ao modelo e deixa o Angular trabalhar sua mágica. Obviamente, esse conceito também é aplicável ao Angular 1.x.
Aqui está um exemplo completo: http://www.syntaxsuccess.com/viewarticle/recursive-treeview-in-angular-2.0
fonte
Você pode usar o injetor de recursão angular para isso: https://github.com/knyga/angular-recursion-injector
Permite fazer aninhamentos de profundidade ilimitados com condicionamento. Recompila apenas se necessário e compila apenas os elementos corretos. Nenhuma mágica no código.
Uma das coisas que permite que ele trabalhe mais rápido e mais simples que as outras soluções é o sufixo "--recursion".
fonte
Quando a estrutura da árvore é grande, o Angular (até 1.4.x) fica muito lento ao renderizar um modelo recursivo. Depois de tentar várias dessas sugestões, acabei criando uma string HTML simples e usando-a
ng-bind-html
para exibi-la. Obviamente, esse não é o modo de usar os recursos angularesUma função recursiva básica é mostrada aqui (com HTML mínimo):
No modelo, ele precisa apenas dessa linha:
Isso ignora toda a ligação de dados do Angular e simplesmente exibe o HTML em uma fração do tempo dos métodos de modelo recursivo.
Com uma estrutura de menus como esta (uma árvore de arquivos parcial de um sistema de arquivos Linux):
A saída se torna:
fonte
Não é complicado.
código do controlador:
fonte