12

我有两个具有这样关系的 ember 模型

App.Foo = DS.Model.extend
   bar: DS.belongsTo("App.Bar", embedded: true)

App.Bar = DS.Model.extend
   primaryKey: "blah"
   blah: DS.attr "string

如果我创建并保存这样的新记录:

foo = App.store.createRecord App.Foo
foo.set "bar", App.Bar.createRecord(blah: "blahblah")
App.store.commit()

我看到对服务器的 2 个发布请求:

URL: /foos
Payload: {"foo":{"bar":null}}

URL: /bars
Payload: {"bar":{"blah":"blahblah"}}

该关联是嵌入的,所以我想看看:

URL: /foos
Payload: {"foo":{"bar":{"blah":"blahblah"}}}

我可以使用 ember-data REST 适配器来实现这一点,还是我需要编写自己的代码来做到这一点?

4

2 回答 2

2

我在我的应用程序中观察到相同的行为。将 'embedded' 设置为 true 只会帮助您获取嵌入的数据,但在您发布数据时会生成单独的请求。如果您想在一个请求中实现它,您已经编写了您的代码。

于 2012-10-03T09:11:16.203 回答
1

这不是您问题的直接答案,但值得我发现,通过尝试一次保存多个模型来“对抗”Ember 的设计让我走上了一条可怕的道路。

Bar为新对象添加所需的属性,Foo然后在服务器上创建并返回新对象,这样更容易、更可靠,如下所示:

App.Foo = DS.Model.extend({
  blah: DS.attr('string'),
  barName: DS.attr('string'),
  bar: DS.belongsTo('bar')
})

this.store.createRecord('foo', { blah: "stuff", barName: "foo" }).save()

# => POST /foos

Request:
{ foo: { blah: "stuff", bar_name: "boo" } }

Response:
{ foo: { id: 1, blah: "stuff", bar: { id: 1, name: "boo" } } }

是的,你最终得到了一个未使用的属性 on Foo,但是你为自己节省了很多代码。

于 2014-01-13T18:17:49.550 回答