你能否有人给我一个可理解的例子,一个requirejs单例,下划线的一次()?
我到目前为止:
define(['jquery', 'underscore', 'backbone'], function($, _, Backbone) {
var SingletonModel = Backbone.Model.extend({
urlRoot: "/model",
idAttribute: "_id"
});
return function() {
once(SingeletonModel);
};
});
正如您所看到的那样,返回语句完全是废话。我根本不知道如何单独使用Backbone.Model ......
答案 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()