我有两个模型。
App.Request = DS.Model.extend({
materials: DS.hasMany('App.Material')
});
App.Material = DS.Model.extend({
request: DS.belongsTo('Mat.Request')
});
在创建请求的表单中,我创建了一个新请求:
App.Request.createRecord();
并将其绑定(bind)到表单的字段。要创建新 Material ,请单击按钮,然后会出现一个模态。当模态出现时,它会在请求的 Materials 数组中创建一个新 Material :( Material 模态有自己的 Controller ,因此我必须通过访问 RequestsNewController 来获取请求。)
this.get('controllers.requestsNew.materials').createRecord();
耶!有用。我可以向请求添加许多 Material ,并且 UI 正在更新以显示关联已正确创建。惊人的!直到...我点击保存按钮,从 RequestsNewController 调用此代码:
this.get('transaction').commit();
现在,我添加到请求中的 Material 被撕掉(模板中显示请求中 Material 的部分现在不显示任何 Material 。)
这是我的代码的一个非常简化的版本,但重点是,在我将数据提交到服务器之前,一切看起来都很好。我对发生的事情有一个理论,但我不知道如何解决它!顺便说一句,我在后端使用带有事件模型序列化器的 Rails。
当我调用 commit 时,Rest Adapter 首先 POST 到/requests。记录已添加,我从服务器返回以下内容:
{
"request": {
"id": 30,
"material_ids": []
}
}
耶!我的请求已保存,现在我从服务器获得了一个 ID。
接下来,REST 适配器 POST 到/materials,并发送以下 JSON:
{
"material": {
"request_id": 0,
}
}
服务器做出响应,为 Material 提供一个 ID。
但这是什么? REST 适配器正在发送 request_id: 0,而不是应有的 request_id: 30?
这是我的理论:保存请求后,服务器响应一个空的material_ids数组。这是有道理的!我们还没有将素材发送到服务器,因为我们首先需要请求 ID!但是,当 Ember Data 看到空的material_ids 数组时,它会从请求中删除这些 Material 。然后,当 Material 保存时,它们不再有请求,因此 request_id: 0。
当我创建一个没有 Material 的请求时,提交,添加 Material ,提交,它起作用了!
我做错了什么?
谢谢!
最佳答案
我认为这是目前已知的问题,并且您的理论是正确的。 ATM,我想到了两个解决方法。第一个是通过如下配置适配器将 Material 嵌入到请求中:
DS.RESTAdapter.map('App.Request', {
materials: {embedded: 'always'}
});
第二个方法是在请求的 didCreate 事件上添加一个观察者,在创建后添加 Material ,然后再次提交。
以下是与此相关的当前相关问题:https://github.com/emberjs/data/pull/440 https://github.com/emberjs/data/pull/724 https://github.com/emberjs/data/issues/437 https://github.com/emberjs/data/pull/643
关于ember.js - 如果 hasMany/belongsTo 关系都是 Ember-Data 中的新关系,则无法保存两者关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16021393/