2013-09-25 5 views
0

Je souhaite créer une directive qui affiche l'info-bulle (from AngularJs Bootstrap UI) en fonction de l'utilisateur autorisé ou non.AngularJs Directive pour info-bulle

Il fait bien le travail et ajouter les attributs requis tooltip et tooltip-position mais l'info-bulle ne se présente pas.

Si je compare l'élément généré par mon code et l'élément qui a une info-bulle comme html normal, son identique, sauf class="ng-scope", l'ajout de cette classe manuellement n'aide pas.

Voici mon code de directive:

proGamersApp.directive('registered', ['$rootScope', 'authService', function ($rootScope, authService) { 
    return { 
     restrict: 'A', 
     scope: true, 
     link: function ($scope, element, attrs) { 
      element.addClass('faded'); 

      $rootScope.$watch('user.role', function (role) { 
       $scope.$apply(function() { 
        var accessLevel = routingConfig.accessLevels[attrs.accessLevel]; 
        if (!authService.authorize(accessLevel)) { 
         element.attr('tooltip-placement', 'bottom'); 
         element.attr('tooltip', 'Avaiable for registered users.'); 
        } else 
         element.attr('tooltip-placement', 'bottom'); 
        element.attr('tooltip', 'Avaiable for registered users.'); 
       }); 
      }); 
     } 
    }; 
}]); 

Toute idée qui que ce soit?

Mise à jour 3 supprimé la «$compile(element) puisqu'il dit sa fonction non définie, et changé l'utilisation de la fonction $ appliquer. toujours obtenir l'erreur '$ digest déjà en cours'.

Code:

proGamersApp.directive('registered', ['$rootScope', 'authService', function ($rootScope, authService, $compile) { 
    return { 
     restrict: 'A', 
     scope: true, 
     link: function ($scope, element, attrs) { 
      element.addClass('faded'); 

      $rootScope.$watch('user.role', function (role) { 
       var accessLevel = routingConfig.accessLevels[attrs.accessLevel]; 
       if (!authService.authorize(accessLevel)) { 
        element.attr('tooltip-placement', 'bottom'); 
        element.attr('tooltip', 'Avaiable for registered users.'); 
       } else { 
        element.attr('tooltip', 'Avaiable for registered users.'); 
       } 

       $scope.$apply(element); 
      }); 

     } 
    }; 
}]); 
+0

Essayez de 'compiler $()' votre élément. – AlwaysALearner

+0

Je ne sais pas si je l'ai fait correctement, mais je l'ai ajouté (voir mise à jour) et rien n'a changé. –

+0

Je l'ai ajouté comme il se doit, jetez un oeil à la publication mise à jour. –

Répondre

1

Essayez d'utiliser $compile comme ceci:

proGamersApp.directive('registered', ['$rootScope', 'authService', '$compile', 
function ($rootScope, authService, $compile) { 
    return { 
     restrict: 'A', 
     scope: true, 
     link: function ($scope, element, attrs) { 
      element.addClass('faded'); 
      $rootScope.$watch('user.role', function (role) { 
       var accessLevel = routingConfig.accessLevels[attrs.accessLevel]; 
       if (!authService.authorize(accessLevel)) { 
        element.attr('tooltip-placement', 'bottom'); 
        element.attr('tooltip', 'Avaiable for registered users.'); 
       } else { 
        element.attr('tooltip', 'Avaiable for registered users.'); 
       } 
       $compile(element.parent().contents())($scope); 
      }); 
     } 
    }; 
}]); 
+0

Mon code avait besoin d'une modification de code afin de fonctionner correctement, mais votre attitude a résolu le problème. Je vous serais reconnaissant d'expliquer pourquoi vous avez utilisé 'element.parent(). Contents()' au lieu de 'element'. –

+0

Je suppose que c'est parce que nous voulons compiler l'élément lui-même tandis que 'contents()' renvoie les éléments enfants. Pas trop sûr cependant: D – AlwaysALearner

1

Une autre façon de gérer ce genre de chose serait d'avoir juste un contrôleur qui met à la disposition dans son champ une variable ou une fonction qui détermine l'accès, puis utilisez ng-cache et ng-show dans le dom pour configurer vos infobulles, ou peu importe.

<div data-ng-controller="SessionCtrl"> 
    <div data-ng-hide="session.active()"> 
     put your logged in user stuff here 
    </div> 
    <div data-ng-hide="session.active()"> 
     put your non logged in user stuff here 
    </div> 
</div> 
+0

Merci, mais je préfère la façon dont je l'ai fait depuis son plus propre ayant directive 'accessLevel' en utilisant un 'authService'. Mon problème est de rendre l'info-bulle visible, car il semble y avoir un problème dans la façon dont l'outil d'amorçage bootstrap fonctionne avec mon code (notez que l'élément lui-même est le même, mais l'info-bulle n'apparaît pas). –

+0

Ok, alors regardez ce que disait l'autre gars, vous pourriez injecter le service de compilation $ dans votre directive, pas créer une fonction de compilation. Ensuite, compilez l'élément après avoir ajouté les attributs de la directive bootstrap. – aet

+0

Merci pour l'aide. Je l'ai ajouté à l'endroit que vous avez dit, je reçois «Erreur: $ digest déjà en cours», jetez un oeil à la publication mise à jour. –