删除hasMany关系中的子记录

时间:2014-03-31 04:27:01

标签: ember.js ember-data

我正在使用Ember 1.4和EmberData beta 7。

删除父记录后,子记录不会自动从商店中删除。所以我试图在删除父节点之前循环删除子节点。

我试过了:

  var self = this;
  itemsToDelete.forEach (function(item){
      self.store.deleteRecord(item);
  });

运行时,某些子记录会被删除;其他人会触发错误说:“无法调用未定义的方法'deleteRecord'。”但是如果我再次运行相同的代码,那么在上一次运行中触发错误的一些子代将被成功删除。如果此代码多次运行,最终将删除所有子代。

这里似乎有一些奇怪的时间问题。有谁知道这是怎么回事?

3 个答案:

答案 0 :(得分:0)

hasManybelongsTo名称可能有些令人困惑。它们看起来好像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);
   });