Ember-数据在内存中创建无关记录

Ember-data creating extraneous record in memory

我与来自 .Net WebAPI 的有效负载(附加字段)存在多对多关系 table,我在 ember-data 中建模。当我向此 table/relationship 添加一条记录时,ember 正在创建一条附加记录,该记录保存在内存中,直到用户执行浏览器页面刷新。我的模型是:

// student.js
export default DS.Model.extend({
    name: DS.attr('string'),
    studentsClasses: DS.hasMany('student-class')
})

// class.js
export default DS.Model.extend({
    desc: DS.attr('string'),
    studentsClasses: DS.hasMany('student-class')
})

// student-class
export default DS.Model.extend({
    studentId: DS.attr('string'),
    student: DS.belongsTo('student'),
    class: DS.belongsTo('class'),
    grade: DS.attr('number')  // payload
})

这是我用来创建和添加多对多记录的代码。

let newRecord = this.get('store').createRecord('student-class');
newRecord.studentId = 1;
newRecord.grade = 3;
class.get('studentsClasses').pushObject(newRecord);

新记录已创建并添加,屏幕上的一切看起来都不错,直到我返回同一页面并且 class.studentClasses 数组中有一个额外的记录。

知道为什么 ember-data 在内存中创建了一个额外的记录吗?请问我该如何阻止它? 谢谢

如您所说,ember-data 将记录保存在内存中。并且您必须记住 ember-data 不会自行删除这些记录。如果具有相同的 id 属性,则只能由您自己将其从内存中删除、页面刷新或替换为新的 payload。您可以通过对 chrome 和 firefox 等浏览器使用 ember 调试插件来观察该行为。

在您的例子中,您已经通过 store.createRecord() 创建了一条新记录。此时,它已经将这条记录添加到你的内存中,并推送到你的class条记录中。如果您没有成功保存这些模型,它将保持名为 'dirty' 的状态,并且如果您从不清理您的存储内存(使用类似 store.unloadRecord() 的东西有一些副作用,或者删除这个未保存的new record from your related model), 下次你使用 store.findRecord() 查找记录时,你强制重新加载记录是没有用的 store.findRecord('class', 1, {reload: true}),它会优先使用你内存中的现有数据。

所以我的建议是在进入这个 class 页面时强制重新加载这个 class 模型。