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 ничего не делает, я не могу понять, почему, можете ли вы помочь и объяснить мне...
Ответы
Ответ 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');
и оно работает...