178 votes

Est-il possible de faire une arborescence avec angulaire ?

Je suis à la recherche pour afficher les données dans une structure en arbre dans une application web. J'espérais utiliser Angulaire pour cette tâche.

Ressemble ng-repeat va me permettre de parcourir une liste de nœuds, mais comment puis-je faire de nidification lorsqu'un nœud donné l'augmentation de la profondeur?

J'ai essayé le code suivant, mais l'auto-sortir de l'HTML est la prévention de ce travail. De Plus, la fin de l'ul de la balise est au mauvais endroit.

Je suis assez sûr que je vais sur ce problème dans le mauvais sens.

Des idées?

234voto

ganaraj Points 14228

Jetez un oeil sur ce violon http://jsfiddle.net/brendanowen/uXbn6/8/

Cela devrait vous donner une bonne idée de la façon d’afficher un `` à l’aide d’angulaire. C’est une sorte d’utiliser la récursivité en html !

77voto

Nick Perkins Points 2431

Si vous êtes en utilisant Bootstrap CSS...

J'ai créé un simple ré-utilisable contrôle d'arborescence (directive) pour AngularJS basé sur Bootstrap "nav" liste. J'ai ajouté supplémentaires de l'indentation, les icônes, et de l'animation. Les attributs sont utilisés pour la configuration.

Ne pas utiliser la récursivité.

Je l'ai appelé angulaires-bootstrap-nav-arbre ( nom accrocheur, vous ne pensez pas? )

Il y a un exemple ici, et la source est ici.

35voto

Mark Lagendijk Points 1232

Lors de la prise de quelque chose comme cela, la meilleure solution est une récursif de la directive. Toutefois, lorsque vous effectuez une telle directive-vous que AngularJS pénètre dans une boucle sans fin.

La solution pour cela est de laisser la directive supprimer l'élément au cours de la compilation de l'événement, et de compiler manuellement et de les ajouter dans le lien des événements.

J'ai trouvé à ce sujet dans ce fil, et une abstraction de cette fonctionnalité dans un service.

module.factory('RecursionHelper', ['$compile', function($compile){
    return {
        /**
         * Manually compiles the element, fixing the recursion loop.
         * @param element
         * @param [link] A post-link function, or an object with function(s) registered via pre and post properties.
         * @returns An object containing the linking functions.
         */
        compile: function(element, link){
            // Normalize the link parameter
            if(angular.isFunction(link)){
                link = { post: link };
            }

            // Break the recursion loop by removing the contents
            var contents = element.contents().remove();
            var compiledContents;
            return {
                pre: (link && link.pre) ? link.pre : null,
                /**
                 * Compiles and re-adds the contents
                 */
                post: function(scope, element){
                    // Compile the contents
                    if(!compiledContents){
                        compiledContents = $compile(contents);
                    }
                    // Re-add the compiled contents to the element
                    compiledContents(scope, function(clone){
                        element.append(clone);
                    });

                    // Call the post-linking function, if any
                    if(link && link.post){
                        link.post.apply(null, arguments);
                    }
                }
            };
        }
    };
}]);

Avec ce service, vous pouvez facilement faire un arbre de la directive (ou d'autres récursive directives). Voici un exemple d'un arbre de la directive:

module.directive("tree", function(RecursionHelper) {
    return {
        restrict: "E",
        scope: {family: '='},
        template: 
            '<p>{{ family.name }}</p>'+
            '<ul>' + 
                '<li ng-repeat="child in family.children">' + 
                    '<tree family="child"></tree>' +
                '</li>' +
            '</ul>',
        compile: function(element) {
            return RecursionHelper.compile(element);
        }
    };
});

Voir ce Plunker pour une démo. J'aime cette solution meilleure, parce que:

  1. Vous n'avez pas besoin d'une directive spéciale qui rend votre html moins propre.
  2. La récursivité est la logique disparaît dans le RecursionHelper service, afin de vous garder vos directives propres.

Mise à jour: Ajout du support pour une mesure de relier les fonctions.

15voto

savagepanda Points 373

Voici un exemple en utilisant une directive récursif : http://jsfiddle.net/n8dPm/ tiré de https://groups.google.com/forum/# ! sujet/angulaire/vswXTes_FtM

12voto

moskiteau Points 817

Celui-ci semble un peu plus complet : https://github.com/dump247/angular.tree

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X