3

コントローラーに挿入される AnguarJS サービスに REST API をラップしました。かなり標準的ですよね。ここで、そのサービスが 401 応答をインターセプトし、何らかの方法でログアウトまたは再ログイン プロンプトなどをトリガーするようにしたいと考えています。問題は、そのサービスがどのスコープにもアクセスできないことです。そのエラーをブロードキャストする最良の方法は何ですか? 私はいくつかのアイデアを思いつきましたが、私はAngularが初めてで、誰かがこれを行う「Angular」の方法を教えてくれるかどうか疑問に思っていますか?

1) サービスを、AppCtrl がリッスンできるイベント プールとして機能させることができます。しかし、これは少し複雑すぎるようです。そう:

myService.on('logout', function() { 
    $scope.isLoggedIn = false;
});

2) $rootScope をサービスに挿入し、サービスをisLoggedIn直接変更できます。しかし、これは明らかに間違っているようです。サービスがデータを処理し、コントローラーがスコープを制御し、ディレクティブが dom をいじる場所を明確に区別したいと思います。

3) 私のすべてのコントローラーは、拒否された promise を監視し、その理由が 401 エラーである場合は、$scope に到達しisLoggedInて false に設定することができますが、このオプションは明らかに最悪です。

何か助けはありますか?

ありがとう。

4

1 に答える 1

4

コミュニケーションをとるために必要な 3 つのコンポーネントがあります。ngSwitch が実行されるコントローラーと API サービスがあることは既にご存じでしょう。3 つ目は、ユーザー情報の管理に使用するある種のユーザー状態サービスです。このタイプのサービスは、AngularJS アプリでは非常に一般的です。そのサービスがどのように見えるかについては、この回答を参照してください。

API サービスは、401 で、現在ログアウトしていることをそのサービスに通知します。これには汎用$httpインターセプターを使用することもできますが、すべての $http呼び出しに影響します。ここであなたの選択。

コントローラーは、この現在の状態を監視するだけで済みます。

$scope.$watch( AuthService.isLoggedIn, function ( isLoggedIn ) {
  $scope.isLoggedIn = isLoggedIn;
});

テンプレートは、そのスコープ変数で ngShow を使用できます。

<div class="login" ng-show="!isLoggedIn">
  ...
</div>

このサービスは、それを必要とするすべてのコントローラーでも利用できます。ユーザーがログインしていないことが先験的にわかっている場合、不要な API 呼び出しを防ぐために、API サービスはリクエストを発行する前に値を確認することもできます。

これには、アプリの構造と既存のコードに応じて無数のバリエーションがありますが、うまくいけば、これが正しい道を示してくれるでしょう。

于 2013-04-02T21:27:43.567 に答える