2015-07-16 18 views
5

Ecco le app.js del mio progetto:

(function() { 
'use strict'; 

angular 
    .module('app', ['ui.router', 'ngCookies', 'angular-inview', 'ngMaterial']) 
    .config(config) 
    .run(run); 

config.$inject = ['$stateProvider', '$urlRouterProvider', '$mdThemingProvider']; 
function config($stateProvider, $urlRouterProvider, $mdThemingProvider) { 
     $mdThemingProvider.theme('default') 
      .primaryPalette('deep-orange') 
      .accentPalette('teal', { 
       'default': 'A400' 
      }); 

     $urlRouterProvider.otherwise('/app'); 

     $stateProvider 
      .state('app', { 
       url: '/app', 
       data: { 
        clearenceLevel: 1 
        }, 
        views: { 
        '': { 
         templateUrl: 'app/views/navbar.html', 
        } 
       } 
      }) 
      .state('home.works', { 
       url: '/works', 
       templateUrl: 'app/views/works.html', 
       controller: 'WorksController as vm' 
      }) 
      .state('login', { 
       url: '/login', 
       templateUrl: 'app/views/login.html', 
       controller: 'LoginController as vm', 
       data: { 
        clearenceLevel: 0 
        } 
      }) 
      .state('register', { 
       url: '/register', 
       templateUrl: 'app/views/register.html', 
       controller: 'RegisterController as vm', 
       data: { 
        clearenceLevel: 0 
        } 
      }); 
} 
run.$inject = ['$rootScope', '$location', '$state', '$cookieStore', '$http', 'AuthenticationService']; 
function run($rootScope, $location, $state, $cookieStore, $http, AuthenticationService) { 
    $rootScope.globals = $cookieStore.get('globals') || {}; 

    if ($rootScope.globals.currentUser) { 
     $http.defaults.headers.common['aimm-token'] = $rootScope.globals.currentUser.token; 
     $http.defaults.headers.common['aimm-id'] = $rootScope.globals.currentUser.id; 
    } 

    $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) { 
     var clearenceLevel = toState.data.clearenceLevel; 
     var loggedIn = $rootScope.globals.currentUser; 

     if (clearenceLevel > 0 && !loggedIn) { 
      alert("redirecting"); 
      return $state.go('login'); 
     } 
    }); 
} 
})(); 

io non posso avere $ state.go() che lavorano. Il $on('$stateChangeStart'...); funziona correttamente e viene visualizzato l'avviso quando si tenta di raggiungere uno stato protetto senza sessione. Ma il return $state.go('login'); non funziona. Reindirizza a /app.

Grazie per il vostro aiuto.

+0

ve si è tentato con $ state.go ("app.login") ?? – Vanojx1

+0

L'ho fatto, senza più successo. Ma non sembrerebbe giusto comunque. –

+1

prova a rimuovere il ritorno e usa solo $ state.go ("login") ... questo è un possibile duplicato http://stackoverflow.com/questions/27212182/angularjs-ui-router-how-to-redirect -to-login-page – Vanojx1

risposta

10

Bene, grazie a @ Vanojx1, ho scoperto di aggiungere e.preventDefault(); prima che lo $state.go('login'); funzionasse. Ancora non capisco perché però.

+4

Il motivo è perché stai usando stateChangeStart, che una volta completato eseguirà una transizione di stato a 'toState', quindi sostituirà il tuo' $ stato.go'. 'e.preventDefault()' dice di non eseguire la transizione 'toState' – Roi

+0

e.preventDefault() non funziona in mozilla .. :( –

+0

ha funzionato per me in Ionic 1 –

5

È necessario eseguire lo $state.go sull'ambito principale e non su un servizio (angolare) o ambito virtuale creato temporaneamente.

È inoltre possibile risolvere il problema avvolgendolo in $timeout o setTimeout che lo registrerà nel ciclo del browser per essere eseguito dopo l'esecuzione del metodo corrente ecc. Anche con 0 millisecondi lo farà, come.

$timeout(()=>{$state.go('xyz')},0) 

o

setTimeout(()=>{$state.go('xyz')},0); 
+1

questo non è raccomandato, in quanto eseguirà due transizioni di stato: uno per 'toState' e poi il nuovo stato. L'uso di' e.preventDefault() 'è l'approccio corretto – Roi

Problemi correlati