问题描述
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的记录都应从存储中删除。 但是,我很高兴听到经验丰富的余烬开发人员对此问题做出一些解释。