5

当我调用我deleteRecord()的一些 hasMany 关系时,Ember Data 会发送一个(成功的)DELETE请求,但该记录不会从视图中删除。我正在使用这样的render助手显示它:

{{render "modules.list" modules}}

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

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

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

4

3 回答 3

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(数据)处理。似乎是(大多数时候),因为这在我的代码的其他部分工作得很好。所以这种情况很可能是某种边缘情况。非常感谢您对可能发生的事情的任何想法。

于 2013-09-15T23:15:58.510 回答
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都会将其从其父关系中删除,并从视图中正确删除。

于 2014-03-04T08:37:53.393 回答
0

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

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

于 2013-09-15T03:20:14.043 回答