我正在使用 Yeoman 包中的 Angular-Fullstack 生成器,包括 Passport.js(FB、G+、Twitter)
我遇到了一个问题,在我$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
成功登录到 /home 后的重定向可以完美地工作,但是当我使用 Grunt 构建项目并在远程服务器上运行它时,该特定重定向不再起作用,即使我可以$location.path('/home')
在我的丑陋代码中看到特定的调用.
如果用户通过身份验证,我什至检查main.controller.js
以确保它重定向到 /home:
'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
,它会重定向到 /#_# 或类似的东西,然后重定向到“/”,一个“主”路由,而不是预期的“家”,在成功登录后,只有手动尝试去 /home - 工作。
我试图理解为什么我在环境之间的行为上有差异,以及为什么 preventDefault 会完全停止 ngRouter 的运行。依赖无法在生产环境中提供相同功能的开发环境是很危险的。
感谢有关此案的任何建议。