和兼容的单例骨干模型

and-compatbile singleton Backbone.Model

本文关键字:模型 单例骨      更新时间:2023-09-26

嗨,有人可以给我一个可以理解的带有下划线的 once() 的 requirejs 单例示例吗?

到目前为止,我有这个:

define(['jquery', 'underscore', 'backbone'], function($, _, Backbone) {
    var SingletonModel = Backbone.Model.extend({
        urlRoot: "/model",
        idAttribute: "_id"
    });
    return function() {
        once(SingeletonModel);
    };
});

正如你所看到的,特别是返回语句完全是废话。我只是不知道如何单调一个骨干模型...

如果您想要一个与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;,然后使用控制台输出检查第二个实例,你将看到它没有第一个实例的属性。

我正在这样做

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;
});

然后,您只需要此文件并像实例一样使用它。

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

underscore.once()