2

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

我有这个:

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

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

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

});

正如你所看到的,return 语句完全是废话。我只是不知道如何单例 Backbone.Model ...

4

2 回答 2

2

如果你想要一个 AMD 兼容的单例,你可以使用以下命令:

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

        return new MyModel();
    }
);

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

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

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

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

于 2012-08-29T10:58:23.833 回答
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()
于 2012-08-22T10:51:30.503 回答