4

ログインするアプリがあり、ユーザーがログインしているかどうかにかかわらず、特定のページにアクセスできるかどうかを決定する必要があります。私が抱えている問題は、特定のルートに到達したときにテンプレートは必要ありませんが、サービスを呼び出してログインページへの送信または続行を処理することです。このサービスは、ユーザーがログインしているかどうかを確認し、ログインしていない場合は window.location.href を使用してログイン ルートに送信します。

window.location.href 行に到達すると、ログイン コントローラーが無限に初期化され (10 回の $digest() 反復に達します)、その時点以降は何も機能しません。リダイレクトがハッシュで行われる限り、何か不足していますか?

これはIE9でのみ発生します。ループの問題は、クロムやサファリでは発生しません。

宛先コード:

angular.module('myApp', []).config(['$routeProvider', function($routeProvider) { 
$routeProvider
  .when('/login', {templateUrl: 'partials/login.html', controller: 'LoginCtrl', title:'Login'})
  .when('/register', {template  : " ", controller:  'RegisterCtrl', title:'Register'})
  .when('/eBooks', {resolve: {redirect: 'LoginRouter'}});
}]);

ログイン ルーティングを処理するためのサービス:

.service('LoginRouter', ['RouteService', '$rootScope', '$window',  function(RouteService, $rootScope, $window) {        

if (!$rootScope.isLoggedIn) {
    RouteService.setModule("eBooks");
    $window.location.href = "#/login"; // Causing infinite loop
}
else {
    var config = $rootScope.config; 
    $rootScope.startLoading();
    $window.location.href = config.EBOOK_URL+ "&bookId=" + config.bookId.replace("-","");
}
}]);

ログイン コントローラ:

.controller('LoginCtrl',['$scope' ,'LoginService', function ($scope, LoginService) {
    $scope.user = {mtn: ""};
    $scope.checkUser = function() {
        LoginService.validateUser($scope);
    };
}]); 

注:コードを変更して、アンカータグとhrefが「login」を指すhtmlテンプレートを指すようにしましたが、問題なく機能しました。ループでスタックするのは、ウィンドウから直接場所の変更を開始したときだけです。

更新: login.html テンプレートからすべてを削除して、html 内の何かが問題を引き起こしているかどうかを確認し、すべてのディレクティブ、およびコントローラー スコープと rootScope の関数/モデルを削除しましたが、それでも問題が発生します。

更新 2 angular を使用して、アンカーをクリックして問題を回避しようとしましたが、それでも発生します。私が気づいた面白いことは、IE でコンソール ウィンドウを開いている場合、そもそも問題が発生しないことです。何が起こっている????

4

3 に答える 3

1

あまり賢くないブラウザ (IE!) がコードを理解できるようにするためだけに、絶対パスを使用することをお勧めします。オリジンを追加してみてください:

 window.location.href = $window.location.origin + "#/login"; 

$window.location.href余談ですが、代わりに使用して正しくやっていると思います$location

これは、AngularJS の公式ドキュメントで推奨されていることです。こちらを参照してください

ページのリロード ナビゲーション

$location サービスでは、URL のみを変更できます。ページをリロードすることはできません。URL を変更してページをリロードしたり、別のページに移動したりする必要がある場合は、下位レベルの API である $window.location.href を使用してください。

于 2013-10-09T16:20:37.027 に答える
1

問題は実際には、アプリ全体にあったコンソール ログ ステートメントであることが判明しました。私はそれらすべてをコメントアウトすることになり、すべてがうまく機能し始めました。これで、コンソールを開いたときにすべてが機能した理由が説明できると思います。IEが好きになりました。

于 2013-10-16T13:49:42.303 に答える