Ember Data在模型save上创建重复记录| ember-cli v3.19

问题描述

Ember在保存时复制模型。 我有两个模型

$('.parent div:not(.yes)').remove();

然后,我创建一个新的“ bill”模型记录,并创建一个“ bill-item”记录,并将其添加到bill模型的billItems属性中。

**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(
        "[email protected]"
    )
    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;
}

然后,当我使用save()“ bill”模型时,我现在在billItems属性中有两条记录。 一是从服务器响应返回的ID,另一是 但是我应该只有一个。 下面是服务器响应。

let bill = this.store.createRecord("bill");
bill.billItems.addobject(this.store.createRecord("bill-item"));

为什么当我只保存一个时,灰烬存储现在有2条“帐单-项目”模型记录? 用于模型的适配器是RESTAdapter,序列化器是JSONSerializer。

Ember inspector attachment for reference

解决方法

先保存billItem

之后

let bill = this.store.createRecord("bill");
bill.billItems.addObject(this.store.createRecord("bill-item"));

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

很明显,您的后端在收到billItem时也创建了bill记录,该记录包括嵌入的billItem,但没有ID。但是,由于ember-data从未显式保存此billItem,因此嵌入的billItem被视为显然也与bill相关联的不同记录,因此被添加到其关系中。 (我没有一个很好的直观解释,为什么仍然与旧的无ID的关联仍然存在-我猜这是因为ember-data仍将其视为未保存的billItem记录(检查器中为绿色),并且仍然记得它与原始bill的(反)关系。)

另一种解决方法可能不是序列化嵌入的记录,而是仅序列号和分别检索记录,但是如果每个billItem恰好属于一个账单,则可能不是您想要的。

,

我遇到了同样的问题。由于我没有足够的时间进行考虑,因此决定使用简单的解决方法。如果成功保存,则可以调用

foo(){
  this.store.peekAll('bill-item')
      .filterBy('isNew',true)
      .forEach(item => this.store.deleteRecord(item));
}

然后,所有没有id的记录都应从存储中删除。 但是,我很高兴听到经验丰富的余烬开发人员对此问题做出一些解释。