2

Passport.js (FB、G+、Twitter) を含む Yeoman パッケージの Angular-Fullstack ジェネレーターを使用しています。

$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 を追加した理由は、他の問題を解決しようとすることでした。

/home へのログインが成功した後のリダイレクト経由は完全に機能しますが、Grunt でプロジェクトをビルドしてリモート サーバーで実行すると、醜いコードでNODE_ENV=development特定の呼び出しが表示されていても、その特定のリダイレクトは機能しなくなります$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 に答える