首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于RequireJS的主干多页应用中的单例模型

基于RequireJS的主干多页应用中的单例模型
EN

Stack Overflow用户
提问于 2013-05-31 03:54:15
回答 3查看 4.8K关注 0票数 4

我有一个使用RequireJS编写的主干多页应用程序。因为它是多页的,所以我决定不使用路由器,因为它太乱了。我尝试了多种方法来创建在整个应用程序中使用的单例对象

代码语言:javascript
运行
复制
var singletonModel= Backbone.Model.extend({

}),
return new singletonModel;

对于上面的内容,我只是使用define方法在类中引用singletonModel模型,然后按原样调用它

代码语言:javascript
运行
复制
this.singleton = singletonModel;
this.singleton.set({'test': 'test'});

在我的下一页的一个模块上,当我调用类似于

代码语言:javascript
运行
复制
this.singleton = singletonModel;
var test = this.singleton.get('test');

单例对象似乎已重新初始化,并且测试对象为空

代码语言:javascript
运行
复制
var singletonModel= Backbone.Model.extend({

}, {
    singleton: null,
    getSingletonModelInst: function () {
        singletonModel.singleton =
            singletonModel.singleton || new singletonModel;
        return singletonModel.singleton;
}

});
return singletonModel;

对于上面的内容,我只是使用define方法在类中引用singletonModel模型,然后按原样调用它

代码语言:javascript
运行
复制
this.singleton = singletonModel.getSingletonModelInst();
this.singleton.set({'test': 'test'});

在我的下一页的一个模块上,当我调用类似于

代码语言:javascript
运行
复制
this.singleton = singletonModel.getSingletonModelInst();
var test = this.singleton.get('test');

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

我想知道这个问题是不是因为我正在使用一个没有路由器的多页应用程序,所以状态没有被保留?以前有没有人尝试过在多页应用中使用单例对象?如果是这样的话,你有没有做一些不同于在单页面应用上实现它的事情?

谢谢,Derm

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-31 09:14:43

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

如果上面是真的,我的观点是你的模型会“活”在一个页面上,当你跳转到下一个页面时,这个模型就会被浏览器“杀死”。因此,如果您想再次看到它,请将其存储在前一页上的其他位置,可能是服务器或本地数据库。在下一页中,从服务器或本地存储加载回它,并将其包装到主干模型中,使其再次“活动”。

票数 3
EN

Stack Overflow用户

发布于 2013-05-31 05:39:02

Bart的回答非常好,但它没有说明如何使用require.js创建单例。答案很简单,只需返回一个已实例化的对象:

代码语言:javascript
运行
复制
define([], function() {

   var singleton = function() {
      // will be called only once
   }

   return new singleton()
})

在这里我们不再有单例:

代码语言:javascript
运行
复制
define([], function() {

   var klass = function() {
      // will be called every time the module is required
   }

   return klass
})
票数 9
EN

Stack Overflow用户

发布于 2013-05-31 04:36:33

下面是我如何在最近的Backbone/Require应用程序中实现单例。状态在任意数量的视图中都会被记住。

instances/repoModel.js

代码语言:javascript
运行
复制
define(['models/Repo'],
    function(RepoModel){
        var repoModel = new RepoModel();

        return repoModel;
    }
);

models/Repo.js

代码语言:javascript
运行
复制
define(['backbone'],
    function(Backbone){

        return Backbone.Model.extend({
            idAttribute: 'repo_id'
        });
    }
);

views/SomePage.js

代码语言:javascript
运行
复制
define(['backbone', 'instances/repoModel'],
    function(Backbone, repoModel) {

        return Backbone.View.extend({
            initialize: function() {
                repoModel.set('name', 'New Name');
            }
        });
    }
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16844808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档