我有一个使用RequireJS编写的Backbone多页面应用程序。因为它是多重的,所以我决定不使用路由器,因为它太乱了。我已经尝试了多种创建单个对象的方法,以便在整个应用程序中使用
var singletonModel= Backbone.Model.extend({
}),
return new singletonModel;
对于上面的内容,我只是使用define方法在我的类中引用singletonModel模型,然后按原样调用它
this.singleton = singletonModel;
this.singleton.set({'test': 'test'});
在我下一页的模块上,然后我调用类似于
的内容this.singleton = singletonModel;
var test = this.singleton.get('test');
单例对象似乎重新初始化并且测试对象为空
var singletonModel= Backbone.Model.extend({
}, {
singleton: null,
getSingletonModelInst: function () {
singletonModel.singleton =
singletonModel.singleton || new singletonModel;
return singletonModel.singleton;
}
});
return singletonModel;
对于上面的内容,我只是使用define方法在我的类中引用singletonModel模型,然后按原样调用它
this.singleton = singletonModel.getSingletonModelInst();
this.singleton.set({'test': 'test'});
在我下一页的模块上,然后我调用类似于
的内容this.singleton = singletonModel.getSingletonModelInst();
var test = this.singleton.get('test');
同样,看起来单例对象正在重新初始化,测试对象为空。
我想知道问题是否是因为我使用的是没有路由器的多页面应用程序,因此状态未被保留?有没有人尝试过在多页面应用程序中使用单例对象?如果是这样的话,你在单页应用程序上的实现方式有何不同?
谢谢, 真皮
答案 0 :(得分:9)
define([], function() {
var singleton = function() {
// will be called only once
}
return new singleton()
})
这里我们不再有单身人士了:
define([], function() {
var klass = function() {
// will be called every time the module is required
}
return klass
})
答案 1 :(得分:2)
听起来可能有点......但是,你做了一个多页面的应用程序,所以当你移动到下一页时,一个全新的文档被加载到浏览器中,并且它上面的每个javascript也会被加载,包括require.js和你的模型。所以require.js被重新加载,它再次创建你的模型,所以你得到的模型与你想象的不同。
如果以上情况属实,我的观点是你的模型会在一个页面上“活动”,当你跳到下一页时,该模型被浏览器“杀死”。因此,如果您想再次查看它,请将其存储在前一页上的其他位置,可能是服务器或localstroe。并在下一页中从服务器或本地商店加载它,并将其包装到Backbone模型中,使其再次“生效”。
答案 2 :(得分:0)
以下是我在最近的Backbone / Require应用程序中实现单例的方法。在任何数量的观点中都会记住国家。
<强>实例/ repoModel.js 强>
define(['models/Repo'],
function(RepoModel){
var repoModel = new RepoModel();
return repoModel;
}
);
<强>模型/ Repo.js 强>
define(['backbone'],
function(Backbone){
return Backbone.Model.extend({
idAttribute: 'repo_id'
});
}
);
<强>视图/ SomePage.js 强>
define(['backbone', 'instances/repoModel'],
function(Backbone, repoModel) {
return Backbone.View.extend({
initialize: function() {
repoModel.set('name', 'New Name');
}
});
}
);