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

Ember.js saving many-to-many relations to server

本文关键字:保存 服务器 关系 js Ember      更新时间:2023-09-27

我有一组名为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张贴到/profiles/的数据是什么,都始终包含"tags": [ null, null, null ]

编辑:我用错误的方式保存了我的模型,这段代码对我有效:

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

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

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

话虽如此,如果您愿意,您可以创建一个自定义序列化程序来发送所有内容,但默认的rest适配器/序列化程序不是这样工作的。