Ember在保存时复制了模型。我有两个模型
**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”记录,并将其添加到账单模型的billItems属性中。
let bill = this.store.createRecord("bill");
bill.billItems.addObject(this.store.createRecord("bill-item"));
那么当我使用保存()对“bill”模型进行处理时,我现在在billItems属性中有两条记录,一条是从服务器响应中返回的id,另一条是But I should have only one.下面是服务器响应。
{
"vehicleNumber": "1231",
"customerName": "123",
"customerMobileNumber": 1231232312,
"createdOn": null,
"total": 23123,
"billItems": [
{
"itemName": "1231",
"cost": 23123,
"id": "9510"
}
],
"id": 467
}
为什么ember存储现在有2个“bill-item”模型的记录,而我只保存了一个?用于模型的适配器是RESTAdapter,序列化器是JSONSerializer。
Ember inspector attachment for reference
2条答案
按热度按时间qlckcl4x1#
首先保存
billItem
。之后
bill
包含一个只有默认属性的billItem
,因此id
是未定义的。当来自bill.save()
的API响应返回时,ember-data接受该响应作为它刚刚试图保存的记录的新状态,更新与存储中的模型不同的所有内容(即,您的后端可以修改其他属性,它们也会被更新)。显然,在接收到包含嵌入式
billItem
但没有id的bill
时,后端也创建了billItem
记录。但是,由于ember-data从未显式保存此billItem
,嵌入的X1 M9 N1 X被视为显然也与X1 M10 N1 X相关联的不同记录,并因此被添加到其关系中。(我没有一个很好的直观解释,为什么与旧的、没有id的记录的关联仍然存在--我猜这是因为ember-data仍然将其视为未保存的billItem
记录(检查器中的绿色),并且仍然记得它与原始bill
的(逆)关系。)另一个修正可能是不序列化嵌入的记录,而只序列化id,并分别检索记录,但如果每个
billItem
只属于一个账单,这可能不是您想要的。1sbrub3j2#
我遇到过同样的问题。由于我没有足够的时间考虑它,我决定使用简单的解决方案。只是在成功保存的情况下,您可以调用
然后,所有没有id的记录都应该从存储中删除。然而,我很高兴听到一些更有经验的ember开发者对这个问题的解释。