2

我有两个模型。

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();

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

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

当我调用 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。

当我创建一个没有材料的请求时,提交,添加材料,提交,它起作用了!

我究竟做错了什么?

谢谢!

4

2 回答 2

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

于 2013-04-15T17:52:38.610 回答
1

您可能对该 PR 感兴趣https://github.com/emberjs/data/pull/876

于 2013-04-17T02:12:10.967 回答