5

バックボーン アプリケーションのログインに取り組んでいますが、サーバーを呼び出さずに解決する方法がわからない問題が発生しました。これにより、他の人々がバックボーンでこの種のものをどのように扱っているかについて、私のチームで議論が持ち上がりました.

今日は金曜日だし、たぶん脳死状態だけど…

ユーザーモデルがあります。ビューの login メソッドは、新しいユーザー モデルを作成し、そのログイン メソッドを呼び出して、ユーザーの資格情報と、ユーザー情報を含むオブジェクトを持つコールバック関数を渡します。

ビューのログイン方法は次のとおりです。

login: function(event){
    event.preventDefault();

    var user = new App.User;
    user.login($('#username').val(), $('#password').val(), 
        (function(msg) {
            // success callback
            if (msg.loggedIn) {
                console.log("Authenticate successful: " + JSON.stringify(msg));
                var data = { user : msg, bob : "bob", trigger:true };
                console.log("Prepared data: " + JSON.stringify(data));
                App.router.navigate('home',data);
            } else {
                console.log("Authenticate unsuccessful: " + JSON.stringify(msg));
            }
        }).bind(this), 
        function(msg) { 
            // failure callback
            console.log("Authenticate communication failure: " + JSON.stringify(msg));
            alert("Communication fail!"); 
            App.router.navigate('login',{trigger:true}); 
        });
}

私たちが理解しようとしているのは、このモデル データを別のルート (ホーム) で利用できるようにして、ビューで使用できるようにする方法です。

だから私はこのルーターを持っています:

routes: {
'': 'home',
'home': 'home',
'login': 'login'
},
home: function(data){
   console.log(data);
}

ユーザーがログインしたら、ルートを更新してそのユーザー データにアクセスする必要がありますが、取得するためにサーバーに戻る必要はありません。

ユーザーがいくつかのステップを前後に移動する必要がある一種の「ウィザード」を構築しているため、心配していますが、アプリケーションをナビゲートするたびにサーバーにアクセスする必要はありませんが、グローバル変数に何かを保存する必要があるか (これはしたくありません)、毎回サーバーに戻る必要があります。他の人も同様の問題に対処しなければならなかったと確信しています。いくつかの洞察を探しているだけです。

ありがとう!

4

3 に答える 3

5

「何かをグローバル変数に保存する必要があるようです(これはしたくありません)」

明白なことを述べると、状態を保持する必要があります。オプションは、状態をサーバーに転送して戻すか、クライアントで状態を保持するかです。サーバーを介して状態を渡したくないことはすでに特定しているため、クライアントの異なるページ (ルート) 間で状態を保持する必要があります。

そして、それがグローバル変数の目的です。うんざりするように聞こえるかもしれませんが、これはシングルページ アプリケーションがもたらす主な利点の 1 つでもあります。ステートフルネス。そして、その状態は常に何らかのグローバル オブジェクトによって保持されます。

状態を管理するには、より良い方法と悪い方法があります。割り当てと再割り当てを繰り返すというグローバル変数を持つことdataは、明らかに最悪の方法です。要件に合ったパターンを見つけ出す必要があります。

私があなたのコード サンプルを正しく理解していれば、保存したいのは現在のユーザーに関する情報です。また、すでにグローバル変数を持っているようですApp。ある種のsession情報を保持することをお勧めします。

login: function(data){
    doLogin({
        success: function(userData) {
            App.session.currentUser = userData;
            App.router.navigate('home', { trigger:true });
        }
    });
},

home: function(data){
    if(!App.session || !App.session.currentUser) {
        App.router.navigate('login', { trigger:true });
        return;
    }

    var user = App.session.currentUser;
    //do something with user
}

国家は必ずしも悪ではない。何が問題かというと、アプリケーション全体のグローバルな状態に依存しているため、テスト不可能なスパゲッティ コードが簡単に作成されてしまうからです。しかし、状態の依存関係を可能な限りチェーンの「上位」 (ルーターなど) として解決し、コンストラクターとメソッド引数を使用して値を渡す場合、残りの部分でテスト可能性と副作用のない状態を維持できます。コードベース。

申し訳ありませんが、特効薬がありません。状態や遷移などの管理に役立つBackbone.StateManagerなどのライブラリがいくつかありますが、基本的に、それらは自分でできないことは何もしません。

于 2013-01-04T21:43:21.780 に答える
1

localStorage を使用してください。

次のようにコードを変更します。

       // success callback
        if (msg.loggedIn) {
            console.log("Authenticate successful: " + JSON.stringify(msg));
            var data = { user : msg, bob : "bob", trigger:true };
            var dataString = JSON.stringify(data);
            console.log("Prepared data: " + dataString;
            window.localStorage.setItem("userdata",dataString);
            App.router.navigate('home',data);

ユーザーがログインしているかどうかを確認する必要があるときはいつでも、次の手順を実行します。

try {
    var userData = window.localStorage.getItem ("userdata");
} catch (e) {
    // Do something
}

認証が一度も成功したことがない場合、コードがバーフしないようにするために、try-catch が必要です。

于 2013-01-04T20:31:33.827 に答える