Ember.js将多对多关系保存到服务器

时间:2013-11-24 21:57:22

标签: javascript ember.js ember-data

我有一组名为ProfileTag的模型。配置文件可以包含许多标记,标记可以属于许多配置文件。我的模型设置如下:

App.Profile = DS.Model.extend({
    name: DS.attr(),
    tags: DS.hasMany('tag')
});

App.Tag = DS.Model.extend({
    title: DS.attr(),
    profile: DS.hasMany('profile')
});

我编写了以下代码来测试关系并将数据提交给服务器:

var profile = this.store.createRecord('profile', {
    name: 'John Doe'
});

var tag1 = this.store.createRecord('tag', {
    title: 'Tag 1'
});

var tag2 = this.store.createRecord('tag', {
    title: 'Tag 2'
});

var tag3 = this.store.createRecord('tag', {
    title: 'Tag 3'
});

profile.get('tags').pushObject(tag1);
profile.get('tags').pushObject(tag2);
profile.get('tags').pushObject(tag3);

profile.save();

然而,即使我先保存标签,然后保存配置文件,关系也永远不会发送到服务器。

无论Ember POST到/profiles/的数据始终包含"tags": [ null, null, null ]

编辑:我以错误的方式保存模型,此代码适用于我:

profile.get('tags').save().then(function() {

    profile.save();

});

1 个答案:

答案 0 :(得分:1)

保存配置文件时,会保存标签的名称和ID。默认情况下发送时,关系不会嵌入到json中。它正在发送标签的ID,这是空的。您需要先保存标记(并且您的服务器需要返回一个id,通常它会返回带有id的整个模型)。然后,当您保存配置文件时,将发送ID。如果你想硬编码一对夫妇,看看它是如何工作的,只需输入id。

var tag1 = this.store.createRecord('tag', {
    title: 'Tag 1',
    id:21838123823
});

总而言之,您可以创建一个自定义序列化程序,如果您愿意,可以发送所有内容,但这不是默认的其余适配器/序列化程序的工作方式。