角度uiルーティングと状態のアプリケーションを作成しました。また、私はユーザーが認証されているかどうかを学習するために使用できるWEB APIコントローラを持っています。問題は、そのWEB APIへのhttp要求が、非同期であるため、結果を返すための遅延があることです。
ユーザーが状態を継続したいとき、認証されているかどうかをチェックして、彼にアクセス権を与えたり、ログインページにリダイレクトしたりするたびに、必要とします。しかし、私は私のWEB APIから答えるまで私が待っていたいsomewayと一緒に走っているアプリが初めてです。
は、私は、コード
PlatformWeb.run(function ($rootScope, $state, $timeout, Authorization) {
$rootScope.$state = $state;
$rootScope.User = {
isAuthenticated: null,
targetState: null
}
Authorization.isAuthenticated().then(function (result) {
$rootScope.User.isAuthenticated = result;
$state.go($rootScope.User.targetState.name);
})
hasAccess = function() {
return $rootScope.User.isAuthenticated;
}
$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
$rootScope.User.targetState = toState;
if ($rootScope.User.isAuthenticated == null)
event.preventDefault();
else {
if (!hasAccess()) {
event.preventDefault();
$state.go('PlatformWeb.Login');
}
}
});});
アプリを実行すると、$ rootScope.User.isAuthenticatedがnullの初めてのこの部分を持っているので、私は状態をロードするために防ぐことができます。私の 'Authorization'サービスでは、認証されているかどうかをユーザーに知らせるために私の非同期関数を呼び出します。あなたがWEP APIから私の結果を戻すときに、私は状態 '$ state.go($ rootScope.User.targetState.name);を変更するので、私はあなたが行くことを望むときに私は状態を維持する前に、彼が望む状態に。それから私は、認証されているかどうかを知っています。彼がいない場合、私は彼をログイン状態にリダイレクトします。
BUT event.preventDefault();
は期待どおりに機能しません。私は私のアプリケーションを実行するとき、私はこのエラー 'angular.min.js:6キャッチコピーエラー:[$ rootScope:infdig] http://errors.angularjs.org/1.3.7/ $ rootScope/infdig?p0 = 10 & p1 =%5B%5D'を複数回取得します。 角度のある文書によると、 '10 $ digest()の繰り返しに達しました。中止! 最後の5回の反復でウォッチャーが発生しました:[] '
私のロジックでは、' stateChangeStart 'はevent.preventDefault();で' $ rootScope.User.isAuthenticated == null 'という条件で機能します。私は知る限り、ここにアプリケーションログを作成し、それ以上実行することはありません。私がWEBAPIから私の結果を返すとき、私はこの機能で再び行くだろうが、今回私は彼をどの国に送るべきかを知っている。
をリダイレクトされているかどうかを取得するには、お勧めします。問題はそれがevent.preventDefault()です。期待どおりに動作していないし、アプリの待機をしない。 – GomuGomuNoRocket
プランナーを作成できますか?私は助ける準備ができていますか?作業の例http://stackoverflow.com/a/26800804/1679310といくつかのリソースを確認してください... –
またこちら.. http://stackoverflow.com/a/26135437/1679310。デフォルトを防止するために、あなたのコードの流れではなく、標準のJSの動作を止めることができます。 toStateがあなたがリダイレクトしたいものであれば、リターンを使って出てください。 –