2016-05-21 7 views
0

Ich arbeite an einer App in Ionic. Nur bestimmte Status müssen angemeldet sein, so dass es optional ist. Ich möchte ein Anmeldemodell auslösen, wenn der Benutzer nicht authentifiziert ist. Ich habe die gesamte Authentifizierung sortiert, bin mir aber nicht sicher, wie ich ein globales Login-Modell einstellen kann.Ionic Model Anmeldefenster als globale Methode?

Zum Beispiel die Standard-Starter-App hat die Anmeldung in der AppCtrl sitzen. Ich kann von der nav Vorlage nav ausführen, indem ich login() ... https://github.com/driftyco/ionic-starter-sidemenu/blob/master/js/app.js

Wie kann ich dies eine globale Methode oder einen Prozess machen? (z. B. ein Login-Modell starten, Post akzeptieren und von einem anderen Controller aufrufen).

^Wäre das eine Fabrik oder ein Service?

Ich suche so etwas wie zu tun ..

.controller('SecureCtrl', function ($state, $scope, User) { 
    if(!isAuthenticated)(){ 

    User.login(); 
    // fires login model as user is not authenticated. 

    }else{ 

    // do stuff}; 
    } 
}) 

Vielleicht kann mich jemand in der richtigen Richtung oder ein einfaches Beispiel zeigen. Ich sehe Tutorials, wie man das macht, aber sie sind hauptsächlich für das Einloggen zuerst und dann für den Zugriff auf alle Routen. Ich brauche den Login-Teil nur auf bestimmten Controllern.

Zum besseren Verständnis möchte ich eine Benutzerfunktion erstellen, die das Login, Abmelden, Show-Modell usw. ausführt. So kann ich einfach von meinem Controller aus anrufen. Benutzer-Anmeldung().

(z)

function User($scope, $ionicModal, $timeout) { 

    // With the new view caching in Ionic, Controllers are only called 
    // when they are recreated or on app start, instead of every page change. 
    // To listen for when this page is active (for example, to refresh data), 
    // listen for the $ionicView.enter event: 
    //$scope.$on('$ionicView.enter', function(e) { 
    //}); 

    // Form data for the login modal 
    $scope.loginData = {}; 

    // Create the login modal that we will use later 
    $ionicModal.fromTemplateUrl('templates/login.html', { 
    scope: $scope 
    }).then(function(modal) { 
    $scope.modal = modal; 
    }); 

    // Triggered in the login modal to close it 
    $scope.closeLogin = function() { 
    $scope.modal.hide(); 
    }; 

    // Open the login modal 
    $scope.login = function() { 
    $scope.modal.show(); 
    }; 

    // Perform the login action when the user submits the login form 
    $scope.doLogin = function() { 
    console.log('Doing login', $scope.loginData); 

    // Simulate a login delay. Remove this and replace with your login 
    // code if using a login system 
    $timeout(function() { 
     $scope.closeLogin(); 
    }, 1000); 
    }; 
} 

// Dann von meinem Controller kann ich einfach anrufen.

Ich bin nicht sicher, wie dies zu tun wäre, wenn Benutzer eine Fabrik, Service, etc. wäre. Jede Hilfe wäre willkommen.

Antwort

1

Sie können die isAuthenticated Statusvariable zum Speichern des Anmeldestatus in $rootScope freigeben und damit den angemeldeten Zustand des Benutzers überprüfen.

.controller('SecureCtrl', function ($state, $scope, $rootScope, User) { 
    if(!$rootScope.isAuthenticated)(){ 
     User.login(); 
     // fires login model as user is not authenticated. 
    } else{ 
     // do stuff 
    }; 
    }) 
}) 

UPDATE: Innerhalb Ihrer User.login verwenden, um die $ionicModal.fromTemplateUrl Methode, um die modalen Pop.

$ionicModal.fromTemplateUrl('templates/mylongform.html', { 
    scope: $scope, 
    animation: 'slide-in-up' 
}).then(function(modal) { 
    $scope.modal = modal; 
}); 

Siehe die Arbeits Umsetzung derselben hier: http://codepen.io/ionic/pen/VLwLOG

+0

Aber wie das Modell zu zeigen ist, wo ich feststecke. Grundsätzlich möchte ich User.login() aufrufen können, was ein Login-Modell auslöst. Wie würde ich das tun? – limit

+0

Aktualisiert die Antwort auf Code hinzufügen für die Verwendung von $ ionicModal –

+0

hmm .. ich sehe. Aber gibt es trotzdem den ganzen Login-Prozess wie ein User-Event? (z. B. User.login (// enthält alle Anmeldefunktionen, startet das Popup)) Scheint überflüssig, Code für jeden Controller duplizieren zu müssen. (z. B. AccountCtrl, DashboardCtrl). Dort stecke ich fest, Fabriken, Dienstleistungen, Module. Ich bin hier verloren, wie ich eine Funktion einstellen kann, die das tut. Ich bin neu in Ionic und eckig. Ich hoffe, das macht Sinn. – limit

1

Ein üblicher Weg, dies zu tun, ist eine benutzerdefinierte Eigenschaft auf Staaten setzen wie ‚needsLogin = true‘ und dann hören die ‚$ stateChangeStart 'Ereignis, wenn der Benutzer nicht eingeloggt ist und der Status, den wir benötigen, sich anmelden muss, dann gehen Sie in den Login-Status.

0
// Double Model in same controller 
// Create the login modal 
$ionicModal.fromTemplateUrl('templates/myloginform.html', 
{ 
    scope: $scope, 
    animation: 'slide-in-up' 
}).then(function(modal) 
{ 
    $scope.modallogin = modal; 
}); 

// Close the login modal 
$scope.closeLogin = function() 
{ 
    $scope.modallogin.hide(); 
}; 

// Open the login modal 
$scope.openLogin = function() 
{ 
    $scope.modallogin.show(); 
}; 

// Create the register modal 
$ionicModal.fromTemplateUrl('templates/myregisterform.html', 
{ 
    scope: $scope, 
    animation: 'slide-in-up' 
}).then(function(modal) 
{ 
    $scope.modalregister = modal; 
}); 

// Close the register modal 
$scope.closeRegister = function() 
{ 
    $scope.modalregister.hide(); 
}; 

// Open the register modal 
$scope.openRegister = function() 
{ 
    $scope.modalregister.show(); 
};