Javascript Ember Data在model save()上创建重复记录| Ember cli v3.19

Javascript Ember Data在model save()上创建重复记录| Ember cli v3.19,javascript,ember.js,ember-data,single-page-application,ember-cli,Javascript,Ember.js,Ember Data,Single Page Application,Ember Cli,余烬在保存时复制模型。 我有两种型号 **bill** export default class BillModel extends Model { @attr("string", { defaultValue: "", uppercase: true }) vehicleNumber; @attr("string", { defaultValue: "" }) customerN

余烬在保存时复制模型。 我有两种型号

**bill**

export default class BillModel extends Model {
    @attr("string", { defaultValue: "", uppercase: true })
    vehicleNumber;

    @attr("string", { defaultValue: "" })
    customerName;

    @attr("number", { defaultValue: "" })
    customerMobileNumber;

    @attr("date")
    createdOn;

    @hasMany("bill-item")
    billItems;

    @attr("number", { defaultValue: 0 })
    total;

    @computed(
        "billItems.@each.cost"
    )
    get computedTotal() {
        let total = 0;
        this.billItems.forEach((item) => {
            if (item.cost)
                total += parseFloat(item.cost);
        });
        return parseFloat(total);
    }
}


**bill-item**

export default class BillItemModel extends Model {
    @attr("string", { defaultValue: "" })
    itemName;

    @attr("number", { defaultValue: null })
    cost;
}
然后,我创建“bill”模型的一个新记录,创建一个“bill item”记录,并将其添加到bill模型的billItems属性中

let bill = this.store.createRecord("bill");
bill.billItems.addObject(this.store.createRecord("bill-item"));
然后,当我使用“bill”模型的save()时,我现在在billItems属性中有两条记录。 一个是从服务器响应返回的id,另一个是 但我应该只有一个。 下面是服务器响应

{
  "vehicleNumber": "1231",
  "customerName": "123",
  "customerMobileNumber": 1231232312,
  "createdOn": null,
  "total": 23123,
  "billItems": [
    {
      "itemName": "1231",
      "cost": 23123,
      "id": "9510"
    }
  ],
  "id": 467
}
为什么余烬商店现在有两条“账单项目”模型的记录,而我只保存了一条? 用于模型的适配器是RESTAdapter,序列化程序是JSONSerializer


我遇到了同样的问题。因为我没有足够的时间考虑它,所以我决定使用简单的变通方法。仅在成功保存的情况下,您可以调用

foo(){
  this.store.peekAll('bill-item')
      .filterBy('isNew', true)
      .forEach(item => this.store.deleteRecord(item));
}
然后,所有没有id的记录都应该从存储中删除。
不过,我很高兴听到更有经验的ember开发人员对这个问题的一些解释。

首先保存
billItem

之后

bill
包含仅具有默认属性的
billItem
,因此未定义
id
。当来自
bill.save()
的API响应返回时,ember data将响应作为它刚刚尝试保存的记录的新状态接受,并更新与存储中的模型不同的所有内容(即,后端可以修改其他属性,并将其更新)

显然,您的后端在接收到包含嵌入的
billItem
且没有id的
billItem
时也创建了一个
billItem
记录。但是,由于余烬数据从未显式保存此
billItem
,嵌入的
billItem
被视为一个不同的记录,显然也与
bill
相关,因此添加到其关系中。(我没有一个很好的直观解释,为什么与旧的、没有id的关联仍然存在——我猜这是因为余烬数据仍然将其视为未保存的
billItem
记录(在inspector中为绿色),并且仍然记得其与原始
bill
的(反向)关系)


另一个解决方案可能不是序列化嵌入的记录,而是只序列化ID并分别检索记录,但如果每个
billItem
恰好属于一张账单,这可能不是您想要的。

我认为您有两条记录,因为您创建了两次
createRecord
。我想你根本不需要第二个。我使用createdRecord()只创建了一次账单项目记录。如果我不应该使用第二个createRecord,那么我应该如何将账单项目记录添加到账单模型中?@r4M您仍然可以使用我的solution@MichałHabigier是的,我可以用你的,但更像是黑客。我希望找出这种行为的确切原因,看看这是否是一个bug,或者我是否在做任何不推荐的事情。
let bill = this.store.createRecord("bill");
bill.billItems.addObject(this.store.createRecord("bill-item"));