2016-03-20 3 views
0

Я слушаю $stateChangeStart в своем разделе run, чтобы перенаправить на страницу входа, если пользователь не вошел в систему (используя мой пользовательский loginProvider для проверки).Как перезагрузить конфигурацию с помощью углового ui-router?

Если пользователь не выполнил вход в систему, переход на /#/home успешно изменит URL-адрес на /#/login ... Это не перезагружает страницу, хотя, тем самым, дает пользователю доступ к домашней странице в любом случае.

Итак, как вы перезагружаете маршрут?

angular.module("app", [ 
    "app", 
    "ui.router" 
]) 
    .config(["$stateProvider", "$urlRouterProvider", "$httpProvider", function ($stateProvider, $urlRouterProvider, $httpProvider) { 
     $stateProvider 
      .state("login", { 
       url: "/login", 
       templateUrl: "app/login/login.html", 
       controller: "loginController", 
       authenticate: false 
      }) 
      .state("home", { 
       url: "/home", 
       templateUrl: "app/home/home.html", 
       controller: "homeController", 
       authenticate: true 
      }); 

     $urlRouterProvider.otherwise("login"); 
    }]) 
    .run(["$rootScope", "$state", "loginProvider", function ($rootScope, $state, loginProvider) { 
     $rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) { 
      if (toState.authenticate && !loginProvider.isLoggedIn()) { 
       $state.transitionTo("login"); 
       $state.reload(); // not working 
       $state.go("login", {}, {reload: true}); // not working 
      } 
     }); 
    }]); 

Я использую угловую версию 1.5.1 и версию углового ui-router версии 0.2.18.

+0

есть ошибки? – Sandeep

+0

@Sandeep Нет ошибок, просто переходите к '/ #/home', чтобы изменить URL-адрес'/#/login' ... но все равно показывает домашнюю страницу. Я хочу, чтобы он переместился на * и * перезагрузил страницу входа. –

+1

см. Мой ответ может быть полезным для u – Sandeep

ответ

2

event.preventDefault();

.run(["$rootScope", "$state", "loginProvider", function ($rootScope, $state, loginProvider) { 
     $rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) { 
      if (toState.authenticate && !loginProvider.isLoggedIn()) { 
       event.preventDefault(); 
       $state.go("login", {}, {reload: true}); 
      } 
     }); 
    }]); 
+0

Спасибо @Sandeep! Использование 'event.preventDefault()' теперь переадресовывается к '/ #/login' * и * reloads, когда не вошел в систему. Однако теперь * после входа в систему * обновление' F5' на '/ #/home' re -продолжает вернуться к логину ... –

+0

Я думаю, что ваше состояние не правильно. проверьте свое состояние. – Sandeep

+0

Я добавил дополнительное условие, которое вы предлагаете ([см. Мой ответ здесь] (http://stackoverflow.com/a/36121737/1298685)). Это решает проблему, за исключением обновления 'F5', который удалит информацию' isLoggedIn'. * Так *, кажется, мне нужно использовать '$ cookies' для сохранения данных на странице обновления. Это другой вопрос, поэтому я отмечу это как ответ. Еще раз спасибо @Sandeep! –

0

Благодаря @ ответ SANDEEP, я решить большинство проблем маршрутизации в $rootScope.$on("$stateChangeStart"... с этим кодом:

var isLoggedIn = loginProvider.isLoggedIn(); 

if (toState.authenticate && !isLoggedIn) { 
    event.preventDefault(); 
    $state.transitionTo("login"); 

} else if (fromState.name === "home" && isLoggedIn) { 
    event.preventDefault(); 
    $state.transitionTo("home"); 
} 

Обратите внимание, что моя isLoggedIn логика делает не выжить F5 обновления страницы в - для этого необходимо использовать angular-cookies, angular-local-storage или тому подобное.

Смежные вопросы