2015-07-16 14 views
5

Hier ist die app.js meines Projekts:

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

Ich kann einfach nicht state.go $ haben() arbeiten. Die $on('$stateChangeStart'...); funktioniert einwandfrei, und die Warnung wird ausgelöst, wenn versucht wird, einen geschützten Status ohne Sitzung zu erreichen. Aber die return $state.go('login'); funktioniert nicht. Es leitet zu /app um.

Danke für Ihre Hilfe.

+0

ve Sie versucht mit $ state.go ("app.login") ?? – Vanojx1

+0

Ich tat, mit keinem Erfolg mehr. Aber es scheint sowieso nicht richtig zu sein. –

+1

versuchen, die Rückkehr zu entfernen und verwenden Sie nur die $ state.go ("Login") ... Dies ist ein mögliches Duplikat http://stackoverflow.com/questions/27212182/angularjs-ui-router-how-to-redirect -to-login-page – Vanojx1

Antwort

10

Nun, dank @ Vanojx1, habe ich herausgefunden, e.preventDefault(); vor der $state.go('login'); hat es funktioniert. Verstehe immer noch nicht warum.

+4

Der Grund dafür ist, dass Sie stateChangeStart verwenden - was nach der Fertigstellung einen Zustandsübergang zum 'toState' macht, also überschreibt Ihr' $ state.go'. 'e.preventDefault()' sagt ihm, nicht die 'toState' Übergang – Roi

+0

e.preventDefault() funktioniert nicht in mozilla .. :( –

+0

arbeitete für mich in Ionic 1 –

5

Sie müssen die $state.go auf Hauptbereich und nicht in einem (eckigen) Dienst oder virtuellen Bereich vorübergehend erstellt ausführen.

Sie können auch das Problem lösen, indem es in $timeout oder setTimeout Verpackung, die es im Browser-Schleife registrieren wird ausgeführt werden, nachdem die aktuelle Methode mit 0 Millisekunden läuft usw. selbst wird es tun, wie.

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

oder

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

dies ist nicht zu empfehlen, da es zwei durchführen wird Zustandsübergänge.Ein "toState" dann zu dem neuen Zustand. Die Verwendung von "e.preventDefault()" ist der richtige Ansatz – Roi

Verwandte Themen