Javascript 隐藏来宾用户元素的指令

Javascript 隐藏来宾用户元素的指令,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我想创建一个可以为来宾用户隐藏特定元素的指令。目前我有: angular.module('someMod') .directive('premiumUser', premiumUser) .controller('PremiumUserCtrl', PremiumUserCtrl); function premiumUser () { return { restrict : 'A', link : premiumUserL

我想创建一个可以为来宾用户隐藏特定元素的指令。目前我有:

angular.module('someMod')
    .directive('premiumUser', premiumUser)
    .controller('PremiumUserCtrl', PremiumUserCtrl);

function premiumUser () {
    return {
        restrict   : 'A',
        link       : premiumUserLink,
        controller : 'PremiumUserCtrl',
    };
}

function premiumUserLink (scope, element) {
    if (!scope.checkLoggedIn())
        element.hide();
}

function PremiumUserCtrl ($scope, sessionManager) {
    $scope.checkLoggedIn = function () {
        return sessionManager.isUserLoggedIn();
    };
}
因此,当我将此指令应用于如下元素时:

<ANY premium-user></ANY>
function premiumUser ($animate) {
    return {
        restrict: 'A',
        terminal: true,
        priority: 600,
        transclude: 'element',
        link: function(scope, element, attrs, ctrl, transclude) {
            if (scope.checkLoggedIn()) {
              var childScope;

              if (!childScope) {
                childScope = scope.$new();
                transclude(childScope, function(clone) {
                    $animate.enter(clone, element.parent(), element);
                });
              }
            }
        },
        controller: 'PremiumUserCtrl'
    };
}

它可以工作,但不会阻止目标指令的控制器初始化和执行onInit代码

如何修改此指令以防止控制器初始化


提前谢谢

如果我理解正确,ng If应该可以工作。我认为如果你只是使用一个作用域变量来检查它的可用性。然后将scope.var on指令标记放在模板中


element.hide()
仅设置CSS属性
display:none
,因此任何指令及其控制器仍将初始化

我将实现一个定制的
ng if
-指令,如下所示:

<ANY premium-user></ANY>
function premiumUser ($animate) {
    return {
        restrict: 'A',
        terminal: true,
        priority: 600,
        transclude: 'element',
        link: function(scope, element, attrs, ctrl, transclude) {
            if (scope.checkLoggedIn()) {
              var childScope;

              if (!childScope) {
                childScope = scope.$new();
                transclude(childScope, function(clone) {
                    $animate.enter(clone, element.parent(), element);
                });
              }
            }
        },
        controller: 'PremiumUserCtrl'
    };
}

如果您有兴趣了解更多有关其工作原理的信息,请查看文档和源代码。

您是否正在使用某些工具来处理路由?如果没有,可能值得使用(ui路由器)[。@alphapilgrim是的,我使用它,它如何帮助我?在定义状态的地方,状态有一个解析方法,可以在状态更改之前检查用户类型/凭据。@alphapilgrim我正在使用我的指令隐藏路由模板中的特定元素。如果我想避免来宾用户导航到经过身份验证的u页面,解析可以帮助我仅限sers。您使用的是angulars router还是defactor版本?Yep ng if在这里可以提供帮助,但它需要在使用我的指令的每个控制器上添加一个作用域方法。这就是我希望用指令实现它的主要原因。@xSaber可能只想使用rootScope.userType并将其设置为在在视图中或任何时候,statechange都可以按您设置的方式启动。