2

我正在使用 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 的运行。依赖无法在生产环境中提供相同功能的开发环境是很危险的。

感谢有关此案的任何建议。

4

1 回答 1

0

起初,当你使用ui-router

而不是$location.path('/login');,您必须使用

$state.go("statename")

由于它非常特定于生产环境,我最好的猜测是依赖项没有正确注入。因此,当您修改代码时,请确保使用数组表示法将函数与控制器绑定。

.controller('LoginCtrl', function ($scope, Auth, $location, $window) {

必须像

.controller('LoginCtrl', ["$scope", "Auth", "$location", "$window", function ($scope, Auth, $location, $window) {
// your code here
}]);

这是为了确保正确注入所有依赖项。

于 2015-04-06T14:43:56.870 回答