4

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

再次看起来单例对象正在重新初始化并且测试对象为空。

我想知道问题是否是因为我使用的是没有路由器的多页应用程序,所以没有保留状态?有没有人尝试过在多页面应用程序中使用单例对象?如果是这样,您是否做了与在单页应用程序上实现方式不同的事情?

谢谢, 真皮

4

3 回答 3

9

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-30T21:39:02.193 回答
3

听起来可能有点……但是,你在做一个多页应用程序,所以当你移动到下一页时,一个全新的文档被加载到浏览器中,并且其中的每个 javascript 也会被加载,包括 require.js和你的模型。所以 require.js 被重新加载,它再次创建了你的模型,所以你得到了一个与你想象的不同的模型。

如果上述情况属实,我的观点是您的模型将“活”在一个页面上,当您跳转到下一页时,该模型被浏览器“杀死”。因此,如果您想再次查看它,请将其存储在前一页上的其他位置,可能是服务器或本地服务器。并在下一页从服务器或本地存储加载它,并将其包装到 Backbone 模型中,使其再次“活动”。

于 2013-05-31T01:14:42.727 回答
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');
            }
        });
    }
);
于 2013-05-30T20:36:33.493 回答