2013-09-25 4 views
0

Я хочу создать директиву, которая показывает подсказку (from AngularJs Bootstrap UI) на основе пользователя, авторизованного или нет.AngularJs Directive for Tooltip

Это делает работу хорошо и добавить необходимые атрибуты tooltip и tooltip-position но подсказка не появляется.

Если я сравниваю элемент, сгенерированный моим кодом и элементом, который имеет всплывающую подсказку как обычный html, его идентичный, кроме class="ng-scope", добавление этого класса вручную не помогает.

Вот моя директива код:

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.'); 
       }); 
      }); 
     } 
    }; 
}]); 

Любая идея кто?

Update 3 удалили '$compile(element), поскольку он говорит, что его неопределенная функция, и изменил использование функции $ применяются. все еще получая ошибку «$ digest уже в процессе».

Новый код:

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

Попробуйте '$ компиляции()' вашего элемент. – AlwaysALearner

+0

Не уверен, что я сделал это правильно, но я добавил его (см. Обновление) и ничего не изменилось. –

+0

Я добавил его, как он полагает, взгляните на обновленный пост. –

ответ

1

Попробуйте использовать $compile так:

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

Моему коду понадобилась некоторая модификация кода для правильной работы, но ваше отношение решило проблему. Я был бы признателен, если вы объясните, почему вы использовали 'element.parent(). Contents()' вместо 'element'. –

+0

Я думаю, это потому, что мы хотим скомпилировать сам элемент, а 'contents()' возвращает дочерние элементы. Не слишком уверен: D – AlwaysALearner

1

Другой способ справиться с такого рода вещи было бы просто есть контроллер, который делает доступными в его область видимости переменной или функции, которая определяет доступ, а затем использовать нг скрытие и ng-show в dom для настройки ваших всплывающих подсказок или что-то еще.

<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

Спасибо, но я предпочитаю то, что я сделал, так как его более чистая, имея директиву accessLevel, используя «authService». Моя проблема заключается в том, что всплывающая подсказка видна, поскольку, похоже, проблема связана с тем, как всплывающая подсказка bootstrap работает с моим кодом (обратите внимание, что сам элемент один и тот же, но всплывающая подсказка не отображается). –

+0

Хорошо, тогда посмотрите, что сказал другой парень, вы можете ввести службу компиляции $ в свою директиву, а не создавать функцию компиляции. Затем $ скомпилируйте элемент после добавления атрибутов директивы bootstrap. – aet

+0

Спасибо за помощь. Я добавил его в том месте, где вы сказали, я получаю сообщение «Ошибка: $ digest уже выполняется», посмотрите обновленный пост. –