我有一个使用RequireJS编写的主干多页应用程序。因为它是多页的,所以我决定不使用路由器,因为它太乱了。我尝试了多种方法来创建在整个应用程序中使用的单例对象
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');
同样,看起来单例对象正在被重新初始化,并且测试对象为空。
我想知道这个问题是不是因为我正在使用一个没有路由器的多页应用程序,所以状态没有被保留?以前有没有人尝试过在多页应用中使用单例对象?如果是这样的话,你有没有做一些不同于在单页面应用上实现它的事情?
谢谢,Derm
发布于 2013-05-31 09:14:43
这可能听起来有点...但是,您正在做一个多页面应用程序,所以当您移动到下一个页面时,一个全新的文档被加载到浏览器中,其中的每个javascript也将被加载,包括require.js和您的模型。因此,require.js被重新加载,并再次创建您的模型,因此您得到了一个与您想象的不同的模型。
如果上面是真的,我的观点是你的模型会“活”在一个页面上,当你跳转到下一个页面时,这个模型就会被浏览器“杀死”。因此,如果您想再次看到它,请将其存储在前一页上的其他位置,可能是服务器或本地数据库。在下一页中,从服务器或本地存储加载回它,并将其包装到主干模型中,使其再次“活动”。
发布于 2013-05-31 05:39:02
Bart的回答非常好,但它没有说明如何使用require.js创建单例。答案很简单,只需返回一个已实例化的对象:
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
})
发布于 2013-05-31 04:36:33
下面是我如何在最近的Backbone/Require应用程序中实现单例。状态在任意数量的视图中都会被记住。
instances/repoModel.js
define(['models/Repo'],
function(RepoModel){
var repoModel = new RepoModel();
return repoModel;
}
);
models/Repo.js
define(['backbone'],
function(Backbone){
return Backbone.Model.extend({
idAttribute: 'repo_id'
});
}
);
views/SomePage.js
define(['backbone', 'instances/repoModel'],
function(Backbone, repoModel) {
return Backbone.View.extend({
initialize: function() {
repoModel.set('name', 'New Name');
}
});
}
);
https://stackoverflow.com/questions/16844808
复制相似问题