ember.js ember数据在模型保存时创建重复记录()|ember-客户端v3.19

wa7juj8i  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(135)

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

qlckcl4x

qlckcl4x1#

首先保存billItem
之后

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

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只属于一个账单,这可能不是您想要的。

1sbrub3j

1sbrub3j2#

我遇到过同样的问题。由于我没有足够的时间考虑它,我决定使用简单的解决方案。只是在成功保存的情况下,您可以调用

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

然后,所有没有id的记录都应该从存储中删除。然而,我很高兴听到一些更有经验的ember开发者对这个问题的解释。

相关问题