我正在编写一个javascript库(在coffeescript中),作为非RESTfull API的前端。基本上它的作用是为我的资源定义类,使API调用并按摩它获取的数据,这样我就可以拥有漂亮而干净的对象。
现在,我想在基于Backbone的项目中使用此库,但也没有主干(可能在NodeJS中)。
将它与Backbone一起使用的最简单方法是将我使用此库创建的对象传递给Backbone模型构造函数,以便使用来自对象的属性填充Backbone模型。唯一的问题是这些对象也有它们的功能,所以这些对象将附加到模型的“属性”对象上,我并不满意。在这种情况下,如果我的对象上有一个名为'doStuff'的函数,我将会结束 调用model.attributes.doStuff(),我不确定这有多大意义。
有没有更好的方法来解决这个问题?也许通过传递配置选项让我的库创建普通对象或Backbone模型的方法?
答案 0 :(得分:2)
我会分离与您的对象关联的数据,以便它们不是直接属性,然后为该数据对象添加getter / setter。
var myObject = {
var data = { .... the data ... };
var get = function() { return this.data; }
var set = function(value) { this.data = value; }
};
然后您可以创建这样的Backbone模型。
var x = new myObject();
var model = new Backbone.Model(x.get());
// ... work with model
x.set(model.attributes);
或者,您可以将Backbone模型与相同的数据引用链接起来。
var x = new myObject();
var model = new Backbone.Model();
model.attributes = x.data;
很抱歉,如果以上内容不正确Javascript,但您应该能够理解。
修改强>
您可以包含对myObject
的引用作为建模的第二个参数,但您必须创建自己的模型类。 (基于最新的Backbone版本)。
var myModel = Backbone.Model.extend({
/**
* @type {myObject}
*/
obj: undefined,
initialize: function(attributes, options) {
this.obj = options.obj;
}
});
var x = new myObject();
var model = new myModel(x.get(),{obj:x});
// now you can use Backbone model normally
model.set('field',123);
// call your own functions
model.obj.foo();