Я использую радиально-Fullstack генератор от Yeoman пакета, включая Passport.js (FB, G +, Twitter)ANGULAR является не работает, когда предотвращение события по умолчанию
я попал в проблему, где в моем главном событие $stageChangeStart
при запуске приложения, выражение $location.path('/login');
ничего не делает. Несмотря на то, что он предупреждает до и после вызова выражения, что означает, что код находится там безопасно, и нет ошибок console.log
.
Это произошло после того, как я добавил event.preventDefault();
до того выражения местонахождения:
.run(function ($rootScope, $location, Auth) {
// Redirect to login if route requires auth and you're not logged in
$rootScope.$on('$stateChangeStart', function (event, next) {
Auth.isLoggedInAsync(function(loggedIn) {
if (next.authenticate && !loggedIn) {
event.preventDefault();
// alerts here
$location.path('/login');
// alerts here as well
}
});
});
Причиной, побуждающей добавив, что preventDefault было попытаться решить другую проблему.
NODE_ENV=development
Редирект после успешного входа в систему/дома работает отлично, хотя, когда я строю проект с Grunt и запускаю его на удаленном сервере, этот конкретный перенаправление больше не работает, хотя я вижу конкретный вызов до $location.path('/home')
в моем ушифрованном коде.
Я даже поставить галочку в main.controller.js
, чтобы убедиться, что он перенаправляет/дома, если проверка подлинности пользователя:
'use strict';
angular.module('fckyeah')
.controller('MainCtrl', function ($scope, $http, Auth, socket, $location) {
if (Auth.isLoggedIn()) {
$location.path('/home');
}
});
После успешного входа в систему, редирект, что происходит в моей LoginCtrl:
'use strict';
angular.module('fckyeah')
.controller('LoginCtrl', function ($scope, Auth, $location, $window) {
$scope.user = {};
$scope.errors = {};
$scope.login = function(form) {
$scope.submitted = true;
if(form.$valid) {
Auth.login({
email: $scope.user.email,
password: $scope.user.password
})
.then(function() {
// Logged in, redirect to home
$location.path('/home');
})
.catch(function(err) {
$scope.errors.other = err.message;
});
}
};
$scope.loginOauth = function(provider) {
$window.location.href = '/auth/' + provider;
};
});
Поэтому при запуске с NODE_ENV=production
происходит то, что происходит, он перенаправляет на/# _ # или что-то в этом роде, а затем на «/», «основной» маршрут, а не «домой», как ожидалось, после успешного входа в систему и только ручную попытку ходить в/домой - работает.
Я пытаюсь понять, почему у меня есть разница в поведении между средами и почему preventDefault полностью прекращает работу ngRouter. Опасно полагаться на среду разработки, где она не может обеспечить такую же функциональность при производстве.
Оцените любые советы по этому делу.
Насколько я заметил, иногда вам нужно обернуть эти изменения местоположения через setTimeout или $ timeout с помощью ui-router. также похоже, что вы смешиваете концепцию ui-router и ngRouter, они разные. – YOU