2016-06-28 47 views
8

Abbiamo un'applicazione angolare (SPA) che mantiene la sessione utente lato client (timeout della sessione, periodo di inattività, ecc.). La sessione viene utilizzata per forzare l'utente a riconnettersi quando la sessione scade per qualche motivo.Firefox non aggiorna la pagina correttamente quando lo stato cambia quando non è attivo

La scadenza della sessione è controllata da un servizio dedicato, che trasmette un evento su $ rootScope quando la sessione termina, blocca o modifica in altro modo lo stato.

Aggiungiamo listener agli eventi di modifica dello stato della sessione che modificano il routing alla pagina pertinente (pagina di accesso, pagina di sblocco, ecc.). Stiamo usando angular-ui-router per il routing.

Questo funziona, tuttavia, in particolare in Firefox, se le modifiche allo stato della sessione avvengono quando la finestra/scheda del browser non è attiva (cioè ridotta a icona, in background, ecc.), La pagina non viene aggiornata correttamente. In altre parole, puoi vedere i controlli della nuova pagina (ad esempio campo di testo nome utente e campo password), ma invece di vedere lo sfondo della nuova pagina, vedi quello vecchio.

Funziona perfettamente in Chrome e IE, vediamo solo questo problema su Firefox. Inoltre, quando la finestra/scheda del browser è attiva, funziona perfettamente anche su Firefox.

Qualche idea?

risposta

1

Lasciate che sia il contrario. Non utilizzare la trasmissione rootScope, basta prendere una var nel servizio con lo stato corrente e restituire la funzione con questo valore.

var userSession = 'Expired'; 

return { 
    getSessionState: function() { 
     return userSession; 
    } 
} 

e guardarlo nei controller. Quindi, la prima analisi digerirà la visualizzazione a quella che ti serve ora.

$scope.$watch(function() { 
    return yourServiceName.getSessionState() 
}, function (val) { 
    //you can check the val here and change the route 
}); 

Se questo non ha aiutato, assicurarsi di utilizzare $ timeout (timeout Angolari nativa utilizzando digest) e senza alcun timeout impostato (timeout JS vengono arrestati quando la finestra del browser/scheda non è attivo e del fuoco il tutto a una volta quando il tab è nuovamente a fuoco, cosa può finire con strani comportamenti in Angular).