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