和兼容的单例Backbone.Model

时间:2012-08-19 17:43:16

标签: javascript global-variables requirejs amd

你能否有人给我一个可理解的例子,一个requirejs单例,下划线的一次()?

我到目前为止:

define(['jquery', 'underscore', 'backbone'], function($, _, Backbone) {

    var SingletonModel = Backbone.Model.extend({
        urlRoot: "/model",
        idAttribute: "_id"
    });

    return function() {
        once(SingeletonModel);
    };

});

正如您所看到的那样,返回语句完全是废话。我根本不知道如何单独使用Backbone.Model ......

2 个答案:

答案 0 :(得分:2)

如果您想要兼容AMD的单件,可以使用以下内容:

define(
    [...],
    function() {
        var MyModel = Backbone.Model.extend({
            //...
        });

        return new MyModel();
    }
);

由于require.js的工作方式,你应该只获得一个MyModel实例。

根据我的理解,_.once(someFunction)生成一个只能调用一次的函数,因为它的返回值是存储的,因此每次在第一次调用函数后,都会返回其原始返回值。

但是对于单例情况,你使用_.once(MyModel)的东西会返回一个总是返回相同对象的构造函数(据我所知)。我们可以测试一下:http://jsfiddle.net/gfarrell/Z3CNc/

正如你可以在那个小提琴中看到的那样,如果你在构造函数的末尾return this;就可以了。尝试删除return this;,然后使用控制台输出检查第二个实例,您将看到它没有第一个实例的属性。

答案 1 :(得分:1)

我正在做这个

define(['jquery', 'underscore', 'backbone'], function($, _, Backbone) {

    var SingletonModel = Backbone.Model.extend({
        urlRoot: "/model",
        idAttribute: "_id"
    });

    if (SingletonModel.prototype._instance){
        return SingletonModel.prototype._instance;
    }
    SingletonModel.prototype._instance = new SingletonModel;
    return SingletonModel.prototype._instance;

});

然后你只需要这个文件并使用它,因为它就是一个实例。

编辑: 没有尝试过,但是在你的情况下应该使用once()

underscore.once()