1

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

//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()})

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

在此处输入图像描述

但是,我得到的是以下结构

在此处输入图像描述

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

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

4

1 回答 1

2

首先,这并不像你认为的那样:

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

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

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

设置三个属性。

到了真正的问题。默认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,您必须考虑到这一点:​</p>

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

你可以看看有什么console.log(question.toJSON())要说的,以确认toJSON是错误的。

于 2012-12-31T07:49:55.700 回答