我正在使用Ember 1.4和EmberData beta 7。
删除父记录后,子记录不会自动从商店中删除。所以我试图在删除父节点之前循环删除子节点。
我试过了:
var self = this;
itemsToDelete.forEach (function(item){
self.store.deleteRecord(item);
});
运行时,某些子记录会被删除;其他人会触发错误说:“无法调用未定义的方法'deleteRecord'。”但是如果我再次运行相同的代码,那么在上一次运行中触发错误的一些子代将被成功删除。如果此代码多次运行,最终将删除所有子代。
这里似乎有一些奇怪的时间问题。有谁知道这是怎么回事?
答案 0 :(得分:0)
hasMany
和belongsTo
名称可能有些令人困惑。它们看起来好像Ember-Data正在强制执行层次结构,而不是。实际上,关系只是Ember-Data中的链接,并且不会隐含地保存任何语义信息。因此,当您删除记录时,如果您没有删除记录及其所有“孩子”,则只需删除该记录。换句话说,你所看到的是预期的行为。
现在问你的问题。我认为你的主要问题是你的服务器没有做足够的工作。如果您的数据模型依赖于父项被删除的子项,那么必须在您的服务器上发生。不要让Ember-Data污染你的数据模型;如果那些记录在父母离开后没有业务,你的服务器应该确保自己清理,你不应该通过ember数据手动完成。所以你必须逐个手动删除记录是一个很大的禁忌。
话虽如此,您不必担心手动卸载记录。如果删除父项,则应删除对子项的所有引用,因此应用程序无法访问它们。但是,如果由于某种原因你真的需要这些记录,你应该使用商店的unload。
TL; DR:让您的服务器正确删除记录,然后更改将最终传播。不要尝试手动删除它们。
答案 1 :(得分:0)
正如在另一个答案的讨论中所提到的,如果数据已存在于服务器端,则应让服务器处理所有子记录的删除,而不是发送一连串DELETE请求。
然而,为了回答你关于确保ember-data存储在弄乱前端时保持整洁的另一个问题,我编写了这段代码,有助于回滚模型的所有关系。
var model = this.get('model');
var relatedModel, relatedModels;
model.constructor.eachRelationship(function (key, relationship) {
if (relationship.kind === 'hasMany') {
relatedModels = model.get(key);
if (relatedModels) {
relatedModels.invoke('rollback'); //since this is an array, need to call the rollback function differently
}
}
else {
relatedModel = model.get(key);
if (relatedModel) {
relatedModel.rollback();
}
}
});
model.rollback();
答案 2 :(得分:0)
我认为deleteRecord()不起作用是由EmberData中的错误引起的。我在EmberData问题列表中发布了这个。请参阅:https://github.com/emberjs/data/issues/1846。
有一个解决方法。如果我将代码更改为如下所示,则deleteRecord每次都会工作。
var self = this;
var realArray = itemsToDelete.toArray();
realArray.forEach (function(item){
self.store.deleteRecord(item);
});