フロントエンドにangularjsを使用し、バックエンドの認証にレール+デバイスを使用しています。
フロント エンドでは/#/sign_in
、xhr リクエストからの 401 応答でページにリダイレクトし、toastr を使用してグロウル スタイルのポップアップ メッセージを表示するための responseInterceptor を追加しました。
App.config(['$httpProvider', function ($httpProvider) {
$httpProvider.responseInterceptors.push('securityInterceptor');
}]);
App.factory('securityInterceptor', ['$injector', '$location', '$cookieStore', function ($injector,$location,$cookieStore) {
return function(promise) {
var $http = $injector.get('$http');
return promise.then(null, function(response){
if (response.status === 401) {
$cookieStore.remove('_angular_devise_user');
toastr.warning('You are logged out');
$location.path('/#/sign_in');
}
});
};
});
私の問題は、コントローラーの初期化中にいくつかの xhr リクエストをロードするページをクリックしたときです。たとえば、次のようになります。
var products = Product.query();
var categories = Category.query();
var variations = Variation.query();
これらはさまざまなナビゲーション コンポーネントに必要であり、それらはすべて同時に起動するため、複数のうなり声スタイルのメッセージが重複して発生します。
angular を最初の 401 で終了させ、インターセプター内から残りのコントローラーの実行を停止する方法はありますか? 従来の Rails アプリでは、通常の実行を停止する「before_filter」があり、ページとクエリの読み込みが妨げられていました... angular でこれを行う最善の方法は何ですか?