我有一个多对多的关系表,来自.Net WebAPI的有效负载(附加字段),我已经用ember-data建模了。当我将记录添加到此表/关系中时,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会在内存中创建额外的记录以及如何阻止它做到这一点呢? 感谢
答案 0 :(得分:1)
正如你所说,ember-data将记录保存在内存中。而且你必须记住,ember-data不会自己删除那些记录。如果具有相同的id属性,它只能由您自己从内存中删除,页面刷新或替换为新的有效负载。您可以通过使用ember调试插件为chrome和firefox等浏览器观察该行为。
在您的情况下,您已store.createRecord()
创建了一条新记录。在这一刻,它已经将这条记录添加到你的记忆中了,它被推到了你的班级记录中。如果你没有成功保存这些模型,它将保持一个名为“脏”的状态,如果你从未清理你的商店内存(使用类似store.unloadRecord()
的东西有一些副作用,或删除这个未保存的新记录从您的相关模型中),下次使用store.findRecord()
查找记录时,无法强制记录重新加载store.findRecord('class', 1, {reload: true})
,它将使用内存中的现有数据作为优先级。
所以我的建议是在进入这个类页面时强制重新加载这个类模型。