2013-08-07 16 views
6

Sono incappato in Restangular per effettuare chiamate a un servizio di riposo. Funziona alla grande e restituisce una promessa. Devo essere in grado di avere il blocco di chiamata. La ragione di questo è in una nuova pagina di ricaricamento Non sono tecnicamente loggato ma potrei avere un token memorizzato in un cookie. Mi piacerebbe convalidare questo token contro un servizio di riposo. Il problema è che ne ho bisogno per bloccare.AngularJS (Restangular): creazione di un blocco di promesse? È necessario utilizzarlo per convalidare un token

Se si verifica un timeout o se non è valido, posso trattare l'utente come non autenticato.

Questo è il motivo per cui si desidera bloccare è che vorrei reindirli utilizzando $ location.path a un nuovo URL che non è un token valido.

Questo non accade su un percorso specifico, quindi non posso usare la risoluzione che sta bloccando. Funziona tecnicamente su ogni percorso - Io uso $ on. $ RouteChangeStart e controllo che una variabile interna abbia LoggedIn o no, se non loggato controllo il token memorizzato.

Questo accade su ogni pagina di aggiornamento, ma non durante la navigazione all'interno dell'applicazione.

L'effetto che sto cercando di ottenere è come funziona Gmail.

Guardare avanti per tutta la comprensione qualcuno ha su questo

Grazie

risposta

8

Fondamentalmente è necessario assicurarsi che si verifichi un'azione asincrona prima che si verifichi una modifica del percorso e in questo caso l'azione sta autenticando un utente.

Che cosa si può fare è utilizzare l'evento $routeChangeStart che è emessa al fine di aggiungere una proprietà all'oggetto resolve sulla rotta in questo modo:

function authenticate() { 
    if (user.isAuthenticated) { 
     return; 
    } 
    // Just fake it, but in a real app this might be an ajax call or something 
    return $timeout(function() { 
     user.isAuthenticated = true; 
    }, 3000); 
} 

$rootScope.$on("$routeChangeStart", function(e, next) { 
    console.log("$routeChangeStart"); 
    next.resolve = angular.extend(next.resolve || {}, { 
     __authenticating__: authenticate 
    }); 
}); 

Dal momento angolare attenderà promesse nell'oggetto resolve a essere soddisfatti prima di procedere, è sufficiente utilizzare una pseudo dipendenza come nell'esempio. Usando qualcosa del genere, dovresti essere in grado di garantire che l'utente stia eseguendo l'autenticazione prima dell'esecuzione corretta di tutte le rotte.

Esempio: http://jsfiddle.net/hLddM/

+0

Bello !, questo era quello che stavo cercando. – Martin

0

Penso che il modo migliore per farlo potrebbe essere quello di spingere l'utente in giro con $ location.path, è possibile utilizzare .then() forzare efficacemente un'attesa lasciando l'utente su una pagina di caricamento.

var currentPath = $location.path(); 

$location.path(loadingScreen); 

//Assuming you have some sort of login function for ease. 
Restangular.login(token).then(
    function(result) { 
     $location.path(currentPath) 
    }, 
    function(error) { 
     $location.path(logInScreen) 
    } 
); 
+0

Grazie Matt, che suonava come quello che mi serviva, ma il $ location.path (loadingScreen) cambierei la barra degli indirizzi del browser. Comunque, intorno a questo? – Martin

0

Se stai usando ui-router, si potrebbe passare a un altro stato con lo stesso URL, dove occorre utilizzare che Restangular.login con l'allora, e in caso di successo tornare al " login ", altrimenti, andare nello stato" login "dove l'utente deve inserire il suo nome utente e password.

Se non si utilizza un router, è possibile implementare qualcosa del genere con alcuni ng-switch.

Quindi, al suo arrivo sullo schermo, lo fai Restangular.login e per impostazione predefinita mostra la pagina di caricamento impostando un valore booleano su true. Quindi, se non dovesse succedere, lo mandi al login, altrimenti, imposti il ​​caricamento su false e mostra la pagina.

In ogni caso, mi consiglia vivamente di utilizzare ui-router, culla :)

Spero che questo funziona!

Problemi correlati