带有RequireJS的Backbone多页面应用程序中的Singleton模型

时间:2013-05-30 19:54:15

标签: backbone.js singleton require multipage

我有一个使用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');

同样,看起来单例对象正在重新初始化,测试对象为空。

我想知道问题是否是因为我使用的是没有路由器的多页面应用程序,因此状态未被保留?有没有人尝试过在多页面应用程序中使用单例对象?如果是这样的话,你在单页应用程序上的实现方式有何不同?

谢谢, 真皮

3 个答案:

答案 0 :(得分:9)

巴特的回答非常好,但不是说如何使用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
})

答案 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');
            }
        });
    }
);