如果在Ember-Data中都是新的,则无法保存hasMany / belongsTo关系

时间:2013-04-15 17:39:43

标签: 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();

并将其绑定到表单的字段。要创建新材料,请单击按钮,然后会出现模态。当模态出现时,它会在请求的材质数组中创建一个新材质:(材质模态有自己的控制器,所以我必须通过转到RequestsNewController来获取请求。)

this.get('controllers.requestsNew.materials').createRecord();

耶!有用。我可以向请求添加许多材料,并且UI正在更新以显示正确创建关联。真棒!直到...我点击了保存按钮,从RequestsNewController调用此代码:

this.get('transaction').commit();

现在,我添加到我的请求中的材料被撕掉了(显示请求中材料的模板部分现在没有显示任何材料。)

这是我的代码的一个非常简化的版本,但关键是在我将数据提交到服务器之前一切都很好。我有一个关于发生了什么的理论,但我不知道如何解决它!顺便说一句,我在我的后端使用Rails和Active Model Serializers。

当我调用commit时,Rest Adapter首先POST到/ requests。记录已添加,我从服务器返回以下内容:

{
    "request": {
        "id": 30,
        "material_ids": []
    }
}

耶!我的请求已保存,现在我从服务器获得了一个ID。

接下来,REST适配器POST到/ materials,它发送以下JSON:

{
    "material": {
        "request_id": 0,
    }
}

服务器响应,为材料提供ID。

但是这是什么? REST适配器正在发送request_id:0,而不是request_id:30应该发送它吗?

这是我的理论:保存请求后,服务器以空数组的material_id响应。这很有道理!我们还没有将材料发送到服务器,因为我们首先需要请求ID!但是,当Ember Data看到一个空数组的material_id时,它会从请求中删除材料。然后,当材料保存时,它们不再有请求,因此request_id:0。

当我创建一个没有材料的请求时,提交,添加材料,提交,它就可以了!

我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

我认为这是目前已知的问题,你的理论是正确的。 ATM,我有两个解决方法。第一个是通过配置适配器将材料嵌入到请求中:

DS.RESTAdapter.map('App.Request', {
  materials: {embedded: 'always'}
});

第二个是在请求上添加一个关于didCreate事件的观察者,在创建后添加材料,然后再次提交。

以下是与此相关的当前相关问题: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

答案 1 :(得分:1)

您可能对该公关https://github.com/emberjs/data/pull/876

感兴趣