2

私はAngularの初心者です。どのページでも、ユーザーがログインしているかどうかを確認し、ログインしていない場合はログイン ページに転送し、現在のパスを GET パラメータとして渡すAngular サービスを作成しようとしています。

私はほとんどそこにいますが、うまく機能していません。私が抱えている問題は次のとおりです。ユーザーがに行くと#/articles/my-articles/、に転送され#/login/?next=%2Farticles%2F:module%2Fます。

つまり、Angular が実際の URL ではなく、ルート パターンを渡しているように見えます。

これは私の認証コードです:

auth.run(['$rootScope', '$location', '$user', 'TOKEN_AUTH', 'PROJECT_SETTINGS', function ($rootScope, $location, $user, TOKEN_AUTH, PROJECT_SETTINGS) {
    var MODULE_SETTINGS = angular.extend({}, TOKEN_AUTH, PROJECT_SETTINGS.TOKEN_AUTH);
    $rootScope.$on('$routeChangeStart', function (e, next, current) {
        if (next.$$route && !next.$$route.anonymous && !$user.authenticated) {
          var nextParam = next.$$route.originalPath;
          $location.url(MODULE_SETTINGS.LOGIN + '?next=' + nextParam);
        }
    });
}]);

を使用してハッキーな方法で元のパスを取得できますが、current.params.moduleそれは役に立ちません。なぜなら、それrouteChangeStartは数回起動currentされ、最後の起動以外のすべてでオブジェクトが定義されていないようだからです。

これは私のルートファイルです:

articles.config(['$routeProvider', function ($routeProvider) {
  $routeProvider
    .when('/articles/:module/', {
        templateUrl: 'views/articles/article_list.html',
        controller: 'ArticlesListCtrl'
    })
    .when('/articles/:module/:id/', {
        templateUrl: 'views/articles/article_detail.html',
        controller: 'ArticlesDetailCtrl'
    });
}]);

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

1
auth.run(['$rootScope', '$location', '$user', 'TOKEN_AUTH', 'PROJECT_SETTINGS', function ($rootScope, $location, $user, TOKEN_AUTH, PROJECT_SETTINGS) {
    var MODULE_SETTINGS = angular.extend({}, TOKEN_AUTH, PROJECT_SETTINGS.TOKEN_AUTH);
    $rootScope.$on('$routeChangeStart', function (e, next, current) {
        if (!$user.authenticated) {
          $location.url(MODULE_SETTINGS.LOGIN + '?next=' + $location.path());
          $location.replace();
        }
    });
}]);

ログインが AngularJS ビューでない場合は、otherwiseルートを提供する必要がある場合があります:
($locationProvider 構成によって異なります)

$routeProvider.otherwise({
    template: 'Redirecting…',
    controller : 'Redirect'
});

...

articles.controller('Redirect', ['$location', function($location) {
    if (someConditionThatChecksIfUrlIsPartOfApp) {
        location.href = $location.path();
        return;
    } else {
        // Show 404
    }
}]);

補足:$$接頭辞付きのプロパティは読むべきではありません。これらはプライベート AngularJS 変数です。また、注意: 独自のコードで接頭辞 ( ) を
使用しないでください。これらは AngularJS 用に予約されたパブリック プロパティです。$$user

于 2013-11-27T12:55:27.130 に答える
0

私のソリューションは Angular 1.2.13 で動作します: preventDefault は角度ルーティングを停止し、 $window.location はログイン ページに送られます。これは、ASP.NET MVC + Angular アプリで動作しています。

$rootScope.$on("$locationChangeStart", function (event, next, current) {
                    event.preventDefault();
                    $window.location = '/Login';
            }        
    });
于 2014-04-04T20:21:36.863 に答える