嗨,有人可以给我一个可以理解的带有下划线的 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()