【问题标题】:Require js backbone JS global models需要 js 主干 JS 全局模型
【发布时间】:2012-05-29 15:57:10
【问题描述】:

我想创建一个 UserSession 模型,它使用 jQuery cookie 插件加载会话 ID 并将其保存到 cookie 中。

这是我的 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 成功回调函数)它使用默认值,所以我需要有某种 UserSession 模型的单例实例,我该怎么做这?

我的第一个想法是使用 app 命名空间,因此在我们的 main.js(第一个被加载的主模块)中初始化 UserSession 模块,并且每次另一个模块访问该模块时,需要具有返回 UserSession 实例的对象。

如何才能做到最好?

谢谢

【问题讨论】:

  • 您的第一个想法似乎是完美的解决方案。否则,您必须将用户会话存储在 localStorage/cookies 之类的东西中......
  • 如何在服务器上生成会话并访问它?我想使用相同的方法,但在访问 cookie 内容时遇到问题。我没有登录视图,因为这是由服务器呈现的。

标签: javascript jquery backbone.js requirejs


【解决方案1】:

假设您希望在整个应用程序中使用单个全局 UserSession,我将只从 UserSession 模块返回一个实例化的 UserSession。这样,每当您在定义调用中使用 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 模块一次,无论它在其他地方使用了多少次,因此您在其中实例化的 UserSession 对象实际上是一个单例。

【讨论】:

  • 您也可以将它们分成两个单独的文件,一个 UserSession 和 UserSessionSingleton。如果您从 require 语句中获取实例或构造函数,这可能会更清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多