骨干模型和普通对象

时间:2013-08-02 13:50:06

标签: javascript backbone.js coffeescript

我正在编写一个javascript库(在coffeescript中),作为非RESTfull API的前端。基本上它的作用是为我的资源定义类,使API调用并按摩它获取的数据,这样我就可以拥有漂亮而干净的对象。

现在,我想在基于Backbone的项目中使用此库,但也没有主干(可能在NodeJS中)。

将它与Backbone一起使用的最简单方法是将我使用此库创建的对象传递给Backbone模型构造函数,以便使用来自对象的属性填充Backbone模型。唯一的问题是这些对象也有它们的功能,所以这些对象将附加到模型的“属性”对象上,我并不满意。在这种情况下,如果我的对象上有一个名为'doStuff'的函数,我将会结束 调用model.attributes.doStuff(),我不确定这有多大意义。

有没有更好的方法来解决这个问题?也许通过传递配置选项让我的库创建普通对象或Backbone模型的方法?

1 个答案:

答案 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();