Использование методов $ 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 служба не может принять переопределение конфигурации состояния в своих методах.

Бесконечный цикл был вызван ошибкой с нашей стороны. Я не люблю это, поэтому я все еще ищу лучшие ответы.

Ответы на вопрос(1)

Ваш ответ на вопрос