Использование методов $ state с $ stateChangeStart toState и fromState в Angular ui-router
Я пишу обработчик для$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
служба не может принять переопределение конфигурации состояния в своих методах.
Бесконечный цикл был вызван ошибкой с нашей стороны. Я не люблю это, поэтому я все еще ищу лучшие ответы.