如何在另一个模型对象中嵌入模型对象

时间:2012-12-31 05:56:09

标签: object backbone.js set backbone-model

我正在尝试使用以下代码创建一个包含另一个模型对象的模型对象

//create a question object to be embedded
question = new Onethingaday.Models.Question()
question.set({id:"123456"},{text:"xxxx"},{slug:"xxxx"})

//create the main muse object which contains the question object
muse = new Onethingaday.Models.Muse()
muse.set({question:question.toJSON()})

我希望收到的缪斯模型结构如下:

enter image description here

但是,我得到以下结构

enter image description here

与预期结果相比,我似乎得到另一层'问题:对象'。

如何设置对象以获得预期结果?或者我是否需要操纵结果以删除附加图层?

1 个答案:

答案 0 :(得分:2)

首先,这不符合你的想法:

question.set({id:"123456"},{text:"xxxx"},{slug:"xxxx"})

id设置为"123456",将{text:"xxxx"}视为set的选项,并忽略{slug:"xxxx"}。你想这样说:

question.set({
    id:   "123456",
    text: "xxxx",
    slug: "xxxx"
});

设置三个属性。

关于真正的问题。 default toJSON就是这样:

return _.clone(this.attributes);

所以你必须使用改变toJSON的东西来包含question键而不是简单地返回属性对象。你可以试试Backbone股票:

var M1 = Backbone.Model.extend({});
var M2 = Backbone.Model.extend({});

var m1 = new M1;
m1.set({ a: 'b', c: 'd' });

var m2 = new M2;
m2.set({ m1: m1.toJSON() });

console.log(m2.attributes);

你会在控制台中看到这个:

m1: Object
    a: "b"
    c: "d"

没有额外的命名空间。演示:http://jsfiddle.net/ambiguous/9ptgq/

因此,您或您正在使用的某个库已更改toJSON,您必须考虑到这一点:

var muse = new Onethingaday.Models.Muse()
muse.set(question.toJSON());

您可以查看console.log(question.toJSON())必须说明的内容,以验证toJSON是否有问题。