我想创建一个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模型的单例实例,我该怎么办这个?
我的第一个想法是在我们的main.js(加载的第一个主模块)中使用app命名空间并初始化UserSession模块,并且每次另一个模块访问该模块时,需要具有返回UserSession实例的对象。
如何做到最好?
由于
答案 0 :(得分: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模块一次,无论在其他地方使用多少次,所以你在那里实例化的UserSession对象实际上是一个单独的。