deleteRecord不会从hasMany中删除记录

时间:2013-09-14 21:25:12

标签: ember.js ember-data

当我在某些hasMany关系上调用deleteRecord()时,Ember Data会发送(成功)DELETE请求,但该记录不会从视图中删除。我正在使用render帮助器显示它,如下所示:

{{render "modules.list" modules}}

有趣的是,Ember Inspector在deleteRecord()后显示相应的对象为<App.Module:ember1182:null>且其父对象为null。但是,它的父级仍显示其hasMany中的记录(作为<App.Module:ember1182:null>)当我重新加载页面然后调用deleteRecord()时,它会按预期从视图中删除。

似乎deleteRecord()不会从父级hasMany数组中删除记录。奇怪的是,这在我的代码的其他部分工作正常。我的一个理论是,这与{render}助手有关,因为无论我在哪里使用,我都有同样的问题,但我不确定这是否是导致问题的原因。

我正在使用最新版本的余烬数据(commit 2511cb1f77)。

3 个答案:

答案 0 :(得分:9)

我找到了解决方案。似乎deleteRecord调用了clearRelationships,后者又将模型的belongsTo设置为null。但是它不会清除逆(即它不会从父项的hasMany关系中删除模型)。以下代码修复了它。

var model = this.get('model');
model.eachRelationship(function(name, relationship){
    if (relationship.kind === "belongsTo") {
        var inverse = relationship.parentType.inverseFor(name);
        var parent  = model.get(name);
        if (inverse && parent) parent.get(inverse.name).removeObject(model);
    }
});
this.get('model').deleteRecord();
this.get('model').save();

但是在我看来,这应该由Ember(数据)处理。它似乎是(大部分时间),因为这在我的代码的其他部分工作得很好。所以这种情况很可能是某种边缘情况。任何关于可能发生的事情的想法都非常感激。

答案 1 :(得分:1)

似乎在inverse关系中设置belongsTo参数可以修复它,而无需在Ember Data 0.14中手动清除关系。

App.Item = DS.Model.Extend({
  parent: belongsTo('parent', { inverse: 'items' }) 
});

因此,如果您通过它的父级实例化您的子模型,如下所示:

App.ParentController = Ember.ObjectController.extend({
  actions: {
    add: function() {
      this.get('items').pushObject(this.store.createRecord('item'));
    }
  }
});

对创建的Item deleteRecord实例方法的任何进一步调用都会将其从父关系中删除,并从视图中正确删除它。

答案 2 :(得分:0)

这是一个有效的JSBin,它展示了删除项目的一般想法:http://jsbin.com/ucanam/1059/edit

你能发布一个给你问题的例子吗?