2017-01-06 2 views
0

Ich möchte eine Direktive erstellen, die bestimmte Elemente für Gastbenutzer verbergen kann. Zur Zeit habe ich dies:Richtlinie zum Ausblenden von Elementen des Gastbenutzers

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(); 
    }; 
} 

Also, wenn ich diese Richtlinie auf ein Element wie folgt aus:

<ANY premium-user></ANY> 

es funktioniert, aber es verhindert nicht die Steuerung gezielt Richtlinie onInit Code initialisieren und ausführen .

Wie kann ich diese Anweisung ändern, um eine Controller-Initialisierung zu verhindern?

Vielen Dank im Voraus!

+0

verwenden Sie etwas, um Routen zu behandeln? wenn Sie nicht, könnte es sich lohnen, etwas wie (Ui-Router) [https://github.com/angular-ui/ui-router] zu verwenden. – alphapilgrim

+0

@alphapilgrim Ja, ich benutze es, wie kann es mir helfen? – xSaber

+0

Wenn der Status definiert ist, verfügt state über eine resolve-Methode, die einen Benutzertyp/Anmeldeinformationen vor der Statusänderung prüfen kann. – alphapilgrim

Antwort

0

Wenn ich richtig verstanden habe, sollte ein ng-if funktionieren. Ich denke, wenn Sie nur eine Bereichsvariable verwenden, um ihre Verfügbarkeit zu überprüfen. Platzieren Sie dann den scope.var auf dem Direktiven-Tag in der Vorlage.

<any premium-user ng-if="iSGuest"></any> 
//ctrl 

$scope.isGuest = function() { 
    //processing for guest 
}; 
+0

Yep ng-wenn könnte hier helfen, aber es erfordert das Hinzufügen einer weiteren Scope-Methode zu jedem Controller, wo meine Direktive verwendet wird. Dies ist der Hauptgrund, warum ich es mit einer Richtlinie umsetzen möchte. – xSaber

+0

@xSaber Vielleicht möchten Sie nur rootScope.userType verwenden und es so einstellen, dass Ihr Benutzer im Ausführungsblock dieser Ansicht oder zu jeder Zeit von stateChangeStart auf einmal überprüft wird. – alphapilgrim

0

element.hide() setzt nur die CSS-Eigenschaft display: none, so dass alle Richtlinien und deren Controller werden noch initialisiert werden.

Ich würde implementieren eine benutzerdefinierte ng-if -Richtlinie, etwa wie folgt:

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' 
    }; 
} 

Schauen Sie sich die ngIf docs und Quellcode, wenn Sie daran interessiert sind, mehr zu wissen, wie es funktioniert.

Verwandte Themen