Подтвердить что ты не робот

Module.run() и $state.go() angularJS

У меня может быть какое-то недоразумение. Я использую angular ui router, и у меня есть следующая проблема:

У меня есть следующий поставщик:

angular
.module('MainApp')
.config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider ) {
    $stateProvider
        .state('register', {
            url: "/",
            abstact: true,
            views: {
                "side-bar": {
                    controller: "GetSideBarCtrl"
                },
                "[email protected]": {
                    templateUrl: "/App/Views/WelcomePage.html"
                }
            },
        })
        .state('register.Register', {
            url: "Register",
            views: {
                "page-body": {
                    controller: "RegisterCtrl",
                    templateUrl: "/App/Views/Register.html"
                }
            },
        })
        .state('register.Login', {
            url: "Login",
            views: {
                "page-body": {
                    controller: "LoginCtrl",
                    templateUrl: "/App/Views/Login.html"
                }
            },
        })
        //For registered and loged in users!
    /* */
        .state('main', {
            url: "/:userId",
           // abstact: true,
            views: {
                "side-bar": {
                    controller: "GetSideBarCtrl"
                },
                "[email protected]": {
                  //  controller: "LoginCtrl",
                    templateUrl: "/App/Views/MainPage.html"
                }
            },
        });
    $urlRouterProvider.otherwise('/');
}]);

И запустить функцию

angular
.module('MainApp')
.run(['$rootScope', '$state', '$cookieStore', 'principal',
function ($rootScope, $state, $cookieStore, principal) {
    var cookies = $cookieStore.get('user');
    if (cookies) {
        principal.Authenticate(cookies.split(' ')[0], cookies.split(' ')[1]);
        $state.go('main', { userId: cookies.split(' ')[0] });
    } else {
        $state.go('register.Login');
    }
}]);

Все работает отлично, когда файлы cookie присутствуют и аутентификация работает без каких-либо проблем, но $state.go ничего не делает, я не могу понять, почему, можете ли вы помочь и объяснить мне...

4b9b3361

Ответ 1

Yep, как было предложено, выглядит так: $state.go() не работает корректно в module.run().

Я обнаружил, что использование кода $state в $timeout работает, например.

angular.module('MainApp').run($timeout, $state, ...) {

    $timeout(function() {
        $state.go('main');
    });

}

Ответ 2

Итак, я сделал это по-другому, ive использовал $stateChangeStart, и теперь моя функция запуска выглядит так:

angular
.module('MainApp')
.run(['$rootScope', '$state', '$cookieStore', 'principal',
    function ($rootScope, $state, $cookieStore, principal) {
        var cookies = $cookieStore.get('user');
        if (cookies) {
            principal.Authenticate(cookies.split(' ')[0], cookies.split(' ')[1]);
        }
        $rootScope.$on('$stateChangeStart',
            function (event, toState) {
                if ((toState.name === "register") && (principal.isAuthenticated)) {
                    event.preventDefault();
                    $state.go('main', { userId: principal.identity().userId });
                }
            });
    }
]);

Но я до сих пор не знаю, почему $state.go() не работал...

Ответ 3

У меня точно такая же проблема.
Я использую ionic для создания кросс-платформенного мобильного приложения.
У меня есть логика вроде → если пользователь уже зарегистрирован. Перенаправляет на главную страницу, иначе перенаправляется на страницу входа

if(isLogin("userId")){
    $state.go("main");
}else{
    $state.go("login");
}

Эта работа отлично работает на Android, но иногда приходится на IOS. После некоторых исследований и исследований. Я использую $location.path вместо $state.go, и все работает нормально.

if(isLogin("userId")){
    $location.path("/main");
}else{
    $location.path("/login");
}

Надеюсь, что эта помощь поможет вам решить вашу проблему.

Ответ 4

$state.go не работает в запуске, он еще не инициализирован! То, что я сделал, это бросить логику в службу, добавить контроллер в модуль, в котором вы запускаете, запустить его в контроллере! Это должно работать.

Ответ 5

Просто укажите, что, следуя советам этот поток, вы также можете решить, что он изменит для этого блок иначе:

  $urlRouterProvider.otherwise(function ($injector, $location) {
    var $state = $injector.get("$state");
    $state.go("/");
  });

Надеюсь, что это поможет

Ответ 6

У меня возникла аналогичная проблема. $state.go не работает в функции .run.

Размещение $state.go в службе решило мою проблему.

Ответ 7

Звучит странно, но для меня решение было переименовать мое состояние и удалить точку...

Я хочу, чтобы домашняя страница отличалась для клиента, директора, менеджера или всего (но с тем же адресом)

  .state('home', {
    url : '/',
    templateUrl: 'views/home.html',
    controller: 'HomeCtrl',
    controllerAs: 'home',
    module :'private'
  })
  .state('home.customer', {
    url : '',
    templateUrl: 'views/home-customer.html',
    controller: 'HomeCustomerCtrl',
    controllerAs: 'homeCustomer',
    module :'private'
  })

  .run(function ($rootScope, $state, $window,userService) {
    $rootScope.$on("$stateChangeStart", function(e, toState, toParams, fromState, fromParams) {
     if(toState.name === 'home') {
          if(userService.isCustomer()) {
               $state.go('home.customer');
         }
      }
}

Это не работает, замените имя home.customer на home-customer и $state.go('home-customer'); и оно работает...