Я пишу обработчик для $stateChangeStart
:
var stateChangeStartHandler = function(e, toState, toParams, fromState, fromParams) {
if (toState.includes('internal') && !$cookies.MySession) {
e.preventDefault();
// Some login stuff.
}
};
$rootScope.$on('$stateChangeStart', stateChangeStartHandler);
toState
не имеет метода include. Должен ли я делать что-то другое, или есть способ сделать то, что я пытаюсь сделать?
Кроме того, когда//некоторый элемент ввода включает в себя $state.go(...)
, я получаю бесконечный цикл. Что может вызвать это?
Вот более полный пример, демонстрирующий, что мы в конечном итоге приступили к работе:
angular.module('test', ['ui.router', 'ngCookies'])
.config(['$stateProvider', '$cookiesProvider', function($stateProvider, $cookiesProvider) {
$stateProvider
.state('public', {
abstract: true
})
.state('public.login', {
url: '/login'
})
.state('tool', {
abstract: true
})
.state('tool.suggestions', {
url: '/suggestions'
});
}])
.run(['$state', '$cookies', '$rootScope', function($state, $cookies, $rootScope) {
$rootScope.$on('$stateChangeStart', function(e, toState, toParams, fromState, fromParams) {
if (toState.name.indexOf('tool') > -1 && !$cookies.Session) {
// If logged out and transitioning to a logged in page:
e.preventDefault();
$state.go('public.login');
} else if (toState.name.indexOf('public') > -1 && $cookies.Session) {
// If logged in and transitioning to a logged out page:
e.preventDefault();
$state.go('tool.suggestions');
};
});
});
Мне не нравится использовать indexOf
для поиска определенного состояния в toState
. Это кажется наивным. Я не уверен, почему toState
и fromState
не могли быть экземпляром службы $state
или почему служба $state
не могла принять переопределение конфигурации состояния в своих методах.
Бесконечная петля была вызвана ошибкой с нашей стороны. Мне это не нравится, поэтому я все еще ищу ответы.