Il existe quelques questions et réponses sur les directives angulaires récursives populaires, qui se résument toutes à l'une des solutions suivantes:
- 'compilez' manuellement du HTML de manière incrémentielle en fonction de l'état de la portée d'exécution
- n'utilisez pas du tout une directive, mais un modèle <script> qui se réfère à lui-même
Le premier a le problème que vous ne pouvez pas supprimer le code compilé précédemment à moins de gérer de manière compréhensible le processus de compilation manuelle. La seconde approche pose le problème ... de ne pas être une directive et de passer à côté de ses puissantes capacités, mais de manière plus urgente, elle ne peut pas être paramétrée de la même manière qu'une directive peut l'être; il est simplement lié à une nouvelle instance de contrôleur.
J'ai joué manuellement en faisant une fonction angular.bootstrap
ou @compile()
dans la fonction de lien, mais cela me laisse avec le problème du suivi manuel des éléments à supprimer et à ajouter.
Existe-t-il un bon moyen d'avoir un modèle récursif paramétré qui gère l'ajout / la suppression d'éléments pour refléter l'état d'exécution? C'est-à-dire un arbre avec un bouton d'ajout / suppression de nœud et un champ d'entrée dont la valeur est transmise aux nœuds enfants d'un nœud. Peut-être une combinaison de la deuxième approche avec des portées chaînées (mais je ne sais pas comment faire cela)?
la source
compile: function(element) { return RecursionHelper.compile(element); }
parcompile: RecursionHelper.compile
.Ajouter manuellement des éléments et les compiler est certainement une approche parfaite. Si vous utilisez ng-repeat, vous n'aurez pas à supprimer manuellement les éléments.
Démo: http://jsfiddle.net/KNM4q/113/
la source
Je ne sais pas avec certitude si cette solution se trouve dans l'un des exemples que vous avez liés ou dans le même concept de base, mais j'avais besoin d'une directive récursive, et j'ai trouvé une excellente solution facile .
Vous devez créer la
recursive
directive, puis l'enrouler autour de l'élément qui effectue l'appel récursif.la source
[$compile:multidir] Multiple directives [tree, tree] asking for new/isolated scope on: <recursive tree="tree">
compiledContents(scope,function(clone) { iElement.append(clone); });
:. Sinon, le contrôleur ed "require" n'est pas correctement géré, et error:Error: [$compile:ctreq] Controller 'tree', required by directive 'subTreeDirective', can't be found!
cause.Depuis Angular 1.5.x, plus aucune astuce n'est requise, ce qui suit a été rendu possible. Plus besoin de travail sale!
Cette découverte était un sous-produit de ma recherche d'une solution meilleure / plus propre pour une directive récursive. Vous pouvez le trouver ici https://jsfiddle.net/cattails27/5j5au76c/ . Il prend en charge jusqu'à 1.3.x.
la source
Après avoir utilisé plusieurs solutions de contournement pendant un certain temps, je suis revenu à plusieurs reprises sur ce problème.
Je ne suis pas satisfait de la solution de service car elle fonctionne pour les directives qui peuvent injecter le service mais ne fonctionne pas pour les fragments de modèle anonymes.
De même, les solutions qui dépendent d'une structure de modèle spécifique en effectuant une manipulation DOM dans la directive sont trop spécifiques et fragiles.
J'ai ce que je pense être une solution générique qui encapsule la récursivité en tant que directive à part entière qui interfère de façon minimale avec toute autre directive et peut être utilisée de manière anonyme.
Vous trouverez ci-dessous une démonstration avec laquelle vous pouvez également jouer sur plnkr: http://plnkr.co/edit/MSiwnDFD81HAOXWvQWIM
la source
Maintenant qu'Angular 2.0 est en avant-première, je pense que vous pouvez ajouter une alternative à Angular 2.0 dans le mix. Au moins, cela profitera aux gens plus tard:
Le concept clé est de créer un modèle récursif avec une auto-référence:
Vous liez ensuite un objet d'arborescence au modèle et regardez la récursivité s'occuper du reste. Voici un exemple complet: http://www.syntaxsuccess.com/viewarticle/recursive-treeview-in-angular-2.0
la source
Il existe une solution de contournement vraiment très simple pour cela qui ne nécessite aucune directive.
Eh bien, dans ce sens, ce n'est peut-être même pas une solution du problème d'origine si vous supposez que vous avez besoin de directives, mais c'est une solution si vous voulez une structure GUI récursive avec des sous-structures paramétrées de l'interface graphique. C'est probablement ce que vous voulez.
La solution est basée sur l'utilisation de ng-controller, ng-init et ng-include. Faites-le simplement comme suit, supposez que votre contrôleur s'appelle "MyController", que votre modèle se trouve dans myTemplate.html et que vous avez une fonction d'initialisation sur votre contrôleur appelée init qui prend les arguments A, B et C, ce qui permet de paramétrez votre contrôleur. Ensuite, la solution est la suivante:
myTemplate.htlm:
J'ai trouvé par pure certitude que ce type de structure peut être rendu récursif comme vous le souhaitez en plaine vanille angulaire. Suivez simplement ce modèle de conception et vous pouvez utiliser des structures d'interface utilisateur récursives sans aucun bricolage avancé de compilation, etc.
À l'intérieur de votre contrôleur:
Le seul inconvénient que je peux voir est la syntaxe maladroite que vous devez supporter.
la source
Vous pouvez utiliser angular-recursion-injector pour cela: https://github.com/knyga/angular-recursion-injector
Vous permet de faire une imbrication de profondeur illimitée avec conditionnement. Ne recompilation que si nécessaire et ne compile que les bons éléments. Pas de magie dans le code.
L'une des choses qui lui permet de fonctionner plus rapidement et plus simplement que les autres solutions est le suffixe "--recursion".
la source
J'ai fini par créer un ensemble de directives de base pour la récursivité.
IMO C'est beaucoup plus basique que la solution trouvée ici, et tout aussi flexible sinon plus, donc nous ne sommes pas obligés d'utiliser des structures UL / LI etc ... Mais évidemment, celles-ci ont du sens à utiliser, mais les directives ne le savent pas fait...
Un exemple super simple serait:
L'implémentation de 'dx-start-with' et de 'dx-connect' se trouve sur: https://github.com/dotJEM/angular-tree
Cela signifie que vous n'avez pas à créer 8 directives si vous avez besoin de 8 dispositions différentes.
Créer une arborescence en plus de celle où vous pouvez ajouter ou supprimer des nœuds serait alors plutôt simple. Comme dans: http://codepen.io/anon/pen/BjXGbY?editors=1010
À partir de ce moment, le contrôleur et le modèle pourraient être enveloppés dans sa propre directive si on le souhaite.
la source