7

jQuerycookieプラグインを使用してセッションIDをcookieにロードおよび保存するUserSessionモデルを作成したいと思います。

これは私のUserSessionモデルモジュールのコードです:

define(['jQuery', 'Underscore', 'Backbone'],
function($, _, Backbone){

    var UserSession = Backbone.Model.extend({
        defaults: {
            'accessToken': null,
            'userId': null
        },
        initialize: function(){
            this.load();
        },
        authenticated: function(){
            return Boolean(this.get('accessToken'));
        },
        save: function(authHash){
            $.cookie('userId', authHash.id);
            $.cookie('accessToken', authHash.accessToken);
        },
        load: function(){
            this.userId = $.cookie('userId');
            this.accessToken = $.cookie('accessToken');
        }
    })

    return UserSession;
});

しかし、ログインビューにアクセスしたいとしましょう。

define(['jQuery', 'Underscore', 'Backbone', 'text!templates/login.html', 'models/UserLogin', 'models/UserSession'],
function($, _, Backbone, loginTemplate, UserLogin, UserSession){

    var LoginView = Backbone.View.extend({
        model: new UserLogin,
        el: $('#screen'),
        events: {
            'submit #frm-login': 'login'
        },
        login: function(e){
            e.preventDefault(); // Lets not actually submit.

            this.model.set({
                'username': $('#login-username').val(),
                'password': $('#login-password').val()
            });

            this.model.save(null, {
                success: function(nextModel, response){
                    // Do something here with UserSession model
                },
                error: function(){
                }
            });
        },

        render: function(){
            $(this.el).html(_.template(loginTemplate, {}));
            return this;
        }
    });

    return new LoginView;
});

モジュールでUserSessionモデルにアクセスするたびに(model.save successコールバック関数を参照)、デフォルト値が使用されるため、UserSessionモデルのある種のシングルトンインスタンスが必要です。これを行うにはどうすればよいですか?

私の最初のアイデアは、アプリの名前空間を使用することでした。そのため、main.js(ロードされる最初のメインモジュール)でUserSessionモジュールを初期化し、別のモジュールがそのモジュールにアクセスするたびに、 UserSessionインスタンス。

どうすればこれを最もうまく行うことができますか?

ありがとう

4

1 に答える 1

21

アプリケーション全体で単一のグローバルUserSessionが必要だとすると、UserSessionモジュールからインスタンス化されたUserSessionを返すだけです。そうすれば、define呼び出しでUserSessionを使用するたびに、同じオブジェクトを取り戻すことができます。例えば

define(['jQuery', 'Underscore', 'Backbone'],
function($, _, Backbone){
    var UserSession = Backbone.View.extend({ ... });

    return new UserSession();
});

その後、他の場所:

define(['UserSession'],
function( UserSession ){
    // UserSession in here will be the singleton you created in the UserSession module
    alert( UserSession.authenticated() );
});

Require.jsは、他の場所で使用された回数に関係なく、UserSessionモジュールを1回だけ実行する必要があるため、そこでインスタンス化するUserSessionオブジェクトは事実上シングルトンです。

于 2012-05-29T16:08:32.010 に答える