Existem algumas perguntas e respostas populares sobre diretiva angular recursiva disponíveis, que se resumem a uma das seguintes soluções:
- manualmente 'compila' incrementalmente o HTML com base no estado do escopo do tempo de execução
- não use uma diretiva, mas um modelo <script> que se refere a si mesmo
O primeiro tem o problema de que você não pode remover o código compilado anteriormente, a menos que você gerencie de maneira abrangente o processo de compilação manual. A segunda abordagem tem o problema de ... não ser uma diretiva e perder suas poderosas capacidades, mas mais urgentemente, ela não pode ser parametrizada da mesma maneira que uma diretiva; é simplesmente vinculado a uma nova instância do controlador.
Eu tenho brincado com a execução manual de uma função angular.bootstrap
ou @compile()
no link, mas isso me deixa com o problema de acompanhar manualmente os elementos a serem removidos e adicionados.
Existe uma boa maneira de ter um padrão recursivo parametrizado que gerencia a adição / remoção de elementos para refletir o estado de tempo de execução? Ou seja, uma árvore com um botão de adicionar / excluir nó e algum campo de entrada cujo valor é passado pelos nós filhos de um nó. Talvez uma combinação da segunda abordagem com escopos encadeados (mas não tenho idéia de como fazer isso)?
fonte
compile: function(element) { return RecursionHelper.compile(element); }
porcompile: RecursionHelper.compile
.Adicionar e compilar elementos manualmente é definitivamente uma abordagem perfeita. Se você usar ng-repeat, não precisará remover elementos manualmente.
Demonstração: http://jsfiddle.net/KNM4q/113/
fonte
Não sei ao certo se essa solução foi encontrada em um dos exemplos que você vinculou ou no mesmo conceito básico, mas eu precisava de uma diretiva recursiva e encontrei uma solução ótima e fácil .
Você deve criar a
recursive
diretiva e envolvê-la no elemento que faz a chamada recursiva.fonte
[$compile:multidir] Multiple directives [tree, tree] asking for new/isolated scope on: <recursive tree="tree">
compiledContents(scope,function(clone) { iElement.append(clone); });
Caso contrário, o controlador "require" ed não é tratado corretamente e error:Error: [$compile:ctreq] Controller 'tree', required by directive 'subTreeDirective', can't be found!
cause.A partir do Angular 1.5.x, não são mais necessários truques, o seguinte foi possível. Não há mais necessidade de trabalho sujo!
Essa descoberta foi um subproduto da minha busca por uma solução melhor / mais limpa para uma diretiva recursiva. Você pode encontrá-lo aqui https://jsfiddle.net/cattails27/5j5au76c/ . Suporta até 1.3.x.
fonte
Depois de usar várias soluções alternativas por um tempo, voltei repetidamente a esse problema.
Não estou satisfeito com a solução de serviço, pois funciona para diretivas que podem injetar o serviço, mas não para fragmentos de modelos anônimos.
Da mesma forma, as soluções que dependem da estrutura específica do modelo ao manipular o DOM na diretiva são muito específicas e quebradiças.
Eu tenho o que acredito ser uma solução genérica que encapsula a recursão como uma diretiva própria que interfere minimamente com outras diretivas e pode ser usada anonimamente.
Abaixo está uma demonstração com a qual você também pode brincar em plnkr: http://plnkr.co/edit/MSiwnDFD81HAOXWvQWIM
fonte
Agora que o Angular 2.0 está em pré-visualização, acho que é bom adicionar uma alternativa do Angular 2.0 ao mix. Pelo menos, beneficiará as pessoas mais tarde:
O conceito principal é criar um modelo recursivo com uma referência própria:
Em seguida, você vincula um objeto de árvore ao modelo e observa a recursão cuidar do resto. Aqui está um exemplo completo: http://www.syntaxsuccess.com/viewarticle/recursive-treeview-in-angular-2.0
fonte
Existe uma solução realmente muito simples para isso, que não requer diretrizes.
Bem, nesse sentido, talvez nem seja uma solução do problema original se você assumir que precisa de diretivas, mas É uma solução se você quiser uma estrutura de GUI recursiva com subestruturas parametrizadas da GUI. Qual é provavelmente o que você quer.
A solução é baseada no uso de ng-controller, ng-init e ng-include. Faça o seguinte, suponha que seu controlador seja chamado "MyController", seu modelo esteja localizado em myTemplate.html e que você tenha uma função de inicialização no seu controlador chamada init, que utilize os argumentos A, B e C, possibilitando parametrize seu controlador. Então a solução é a seguinte:
myTemplate.htlm:
Descobri, por pura conincidência, que esse tipo de estrutura pode ser recursivo como você preferir na angular simples de baunilha. Basta seguir este padrão de design e você pode usar estruturas de interface do usuário recursivas sem qualquer modificação avançada de compilação etc.
Dentro do seu controlador:
A única desvantagem que vejo é a sintaxe desajeitada que você precisa suportar.
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
Acabei criando um conjunto de diretrizes básicas para recursão.
IMO É muito mais básico do que a solução encontrada aqui, e tão flexível quanto não mais, por isso não somos obrigados a usar estruturas UL / LI, etc ... Mas obviamente elas fazem sentido usar, no entanto, as diretivas não têm conhecimento disso. facto...
Um exemplo super simples seria:
A implementação de 'dx-start-with' an 'dx-connect' pode ser encontrada em: https://github.com/dotJEM/angular-tree
Isso significa que você não precisa criar 8 diretivas se precisar de 8 layouts diferentes.
Criar uma exibição em árvore em cima da qual você pode adicionar ou excluir nós seria bastante simples. Como em: http://codepen.io/anon/pen/BjXGbY?editors=1010
A partir deste momento, o controlador e o modelo podem ser envolvidos em sua própria diretiva, se alguém desejar.
fonte