8

私の Backbone.js ベースのアプリでは、基になるリクエストが無効な認証トークンなしで、または無効な認証トークンで行われた場合に、401 で応答する API と通信しています。401 を受信するたびに #login ページに移動するように設定したいと思います。

401 を取得するために、Backbone.sync を正常にラップしましたが、その時点で行き詰まりました。ここでいくつかの戦略を試しました:

  1. throw 'unauthorized'Backbone::sync でダウンして、ルーターで取得しようとします。失敗しました:「未承認の未承認」

  2. Backbone::sync でダウンしようとする#.navigate '#login'と、奇妙に見えるだけでなく、アプリが AMD/require.js に基づいており、ラップされた関数で Backbone.Router インスタンスに簡単にアクセスできないという問題が発生しsyncます。

defineこれまでに見た唯一の解決策は、ルーターインスタンスへの参照を取得し、必要に応じて依存関係として配置される「グローバルに利用可能な」キャッシュオブジェクトを作成することです。そのキャッシュ オブジェクトはシングルトンでなければならず、私の「please-no-globals-and-no-namespaces」戦略全体を破りました。

私はここで立ち往生しています。その一般的な問題に対するよりクリーンな解決策を教えてくれる人はいますか?

4

2 に答える 2

9

ajaxError でリダイレクトを行うことができます。

$.ajaxError(function (event, xhr) {
            if (xhr.status == 401)
                window.location = '#login';
        });

すべてが適切に設定されていれば、ルーター インスタンスに手動でアクセスする必要はありません。その URL にアクセスすると、関連付けられたルート機能がトリガーされます。

于 2012-11-12T11:53:43.017 に答える
3

jQuery 1.8 以降を使用している場合、構文が変更されました。

$(document).ajaxError(function (event, xhr) {
        if (xhr.status == 401)
            window.location = '#login';
    });

詳細はjQuery のマニュアルを参照してください。

于 2015-03-02T00:46:13.703 に答える