ember.js - 如果 hasMany/belongsTo 关系都是 Ember-Data 中的新关系,则无法保存两者关系

标签 ember.js ember-data

我有两个模型。

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/

相关文章:

javascript - Ember,如何为 "partial"和 "index"重用相同的 "show"

ember.js动态路由问题

javascript - 使用 Ember-Data 保存时所有项目的数据重复

ember.js - 存储 pushPayload 调用后返回记录

javascript - Emberjs 2.11.0 奇怪的 RSVP 行为

ember-data - 将参数传递给 save()

Ember.js - 如果 URL 直接命中,则处理路由时出错

javascript - EmberJS 从 ember-simple-auth 验证器检索当前用户

javascript - DS.RESTAdapter.map 未定义

javascript - Ember 数据未获取关系